Typescript 如何使电子通道更安全?
以下是我如何处理电子通道上的通信:Typescript 如何使电子通道更安全?,typescript,electron,Typescript,Electron,以下是我如何处理电子通道上的通信: preload.ts contextBridge.exposeInMainWorld("myIpcRenderer", { invoke: (channel: Channel, ...args: any[]) => callIpcRenderer("invoke", channel, ...args), send: (channel: Channel, ...args: any[]) => callIpcRenderer("
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),
});
interface MyIpcRenderer {
invoke(channel: Channel.ReadFiles, ...args: any[]): Promise<ReadFileResult[]>;
}
types.d.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),
});
interface MyIpcRenderer {
invoke(channel: Channel.ReadFiles, ...args: any[]): Promise<ReadFileResult[]>;
}
但是它不能强制在main.ts
中正确使用<代码>ipcMain.handle指的是一种电子方法,它可以接受任何名称的通道并返回任何类型的承诺
ipcMain.handle(
"anychannelnamegoes",
async (_event, paths: string[]): Promise<any> => {
...
}
);
ipcMain.handle(
“anychannelnamegoes”,
异步(_事件,路径:string[]):Promise=>{
...
}
);
如何重写代码以强制执行
main.ts中的main用法?我看到两种方法
第一种可能是覆盖typings.d.ts
文件中的电子库类型声明:
declare module 'electron' {
export interface IpcMain extends NodeJS.EventEmitter {
handle(
channel: Channel,
listener: (
event: IpcMainInvokeEvent,
...args: any[]
) => Promise<void> | any
): void;
}
}
如果要键入当前使用扩展运算符声明的参数,…args:any[]
,则在这两种情况下都需要显式声明参数:
...
listener: (
event: IpcMainInvokeEvent,
arg1: string[],
arg2: boolean,
arg3: number
) => Promise<void> | any
...
。。。
听众:(
事件:IPCMainInvokeeEvent,
arg1:字符串[],
arg2:布尔值,
arg3:数字
)=>承诺|任何
...
您对使用好的旧JS变量而不是字符串文本不满意有什么原因吗export const channelNames={myIpcRenderer:'myIpcRenderer'}
?(为什么你需要TS,发生了什么事?@Aprillion:我不确定我是否理解你的问题。如果你有别的要求,请告诉我。我使用TypeScript枚举的原因是整个项目都是用TypeScript编写的。我可以使用一个JS对象来实现同样的功能,但我认为这会减少TypeScript的表意性。我想问的是,为什么要使用ipcMain.handle之类的变量来限制频道名称(channelNames.myIpcRenderer,…
不够?当您想要从有限的值集中进行选择时,这是惯用的TS,而不仅仅是JS。用于强制有限的值集的惯用TS可能类似于ipcMain.handle(…)
但这取决于库作者来实现,不确定您可以从您的终端执行什么操作。此代码实际上允许键入:1.通道2.传递的参数3.在一个位置为两个函数invoke
和handle
返回结果ipcMain.handler
将接收来自ipcrendre的通信r、 调用
,调用时传递的参数将在处理程序的侦听器回调中。可以使用与通道键入方式相同的方式键入它们,而不是使用字符串
。您可以添加一个更具体的示例吗?我添加了我的想法,不确定这是否有帮助