typescript - 如何使电子通道更安全?
问题描述
以下是我通过 Electron 通道处理通信的方式:
preload.ts
contextBridge.exposeInMainWorld("myIpcRenderer", {
invoke: (channel: Channel, ...args: any[]) =>
callIpcRenderer("invoke", channel, ...args),
send: (channel: Channel, ...args: any[]) =>
callIpcRenderer("send", channel, ...args),
on: (channel: Channel, ...args: any[]) =>
callIpcRenderer("on", channel, ...args),
});
types.d.ts
interface MyIpcRenderer {
invoke(channel: Channel.ReadFiles, ...args: any[]): Promise<ReadFileResult[]>;
}
该MyIpcRenderer
类型强制正确使用renderer.ts
:
const files = await window.myIpcRenderer.invoke(Channel.ReadFiles, [
svgPath,
]);
但它不强制正确使用main.ts
. ipcMain.handle
指的是一种可以接受任何名称的通道并返回任何类型的承诺的电子方法。
ipcMain.handle(
"anychannelnamegoes",
async (_event, paths: string[]): Promise<any> => {
...
}
);
如何重写我的代码以强制执行主要用法main.ts
?
解决方案
我看到了两种方法来做到这一点。
第一种可能性是覆盖typings.d.ts
文件中的电子库类型声明:
declare module 'electron' {
export interface IpcMain extends NodeJS.EventEmitter {
handle(
channel: Channel,
listener: (
event: IpcMainInvokeEvent,
...args: any[]
) => Promise<void> | any
): void;
}
}
考虑到这Channel
是一个字符串文字 ( type Channel = 'channel1' | 'channel2'
),您会得到关于'channel1'
and的建议,但仍然允许'channel2'
初始签名并且可以接受任何字符串。channel: string
我看到的第二种可能性是包装它,这将提供更好的类型安全性:
const myHandler = (
channel: Channel,
listener: (
event: IpcMainInvokeEvent,
...args: any[]
) => Promise<void> | any
) => ipcMain.handle(channel, listener);
// only 'channel1' and 'channel2' would be accepted
myHandler('channel1', (event) => {});
我想键入当前使用扩展运算符...args: any[]
声明的参数,您需要在两种情况下显式声明参数:
...
listener: (
event: IpcMainInvokeEvent,
arg1: string[],
arg2: boolean,
arg3: number
) => Promise<void> | any
...
推荐阅读
- javascript - 生成对象引用的哈希字符串
- java - 在没有DelayedMessage插件或停止线程的Java中延迟消息到RabbitMQ
- javascript - 使用 react-router-dom 在 Route 中添加组件作为道具
- c - Makefile 尝试编译它自己的规则之一,就好像它是一个文件一样
- laravel - 将 PSQL 表达式转换为 Laravel Eloquent Builder 表达式
- mysql - 将 MySQL 中最后插入的项目的 ID 发送到前端。(Express.js)
- excel - Excel VBE 取消隐藏模块代码不再可见
- c++ - 错误 LNK2019 未解析的外部符号 _main
- javascript - Sequelize:按 hassMany 关联字段过滤表
- python - TypeError:“numpy.ndarray”和“str”错误的实例之间不支持“>”