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、 调用
,调用时传递的参数将在处理程序的侦听器回调中。可以使用与通道键入方式相同的方式键入它们,而不是使用
字符串
。您可以添加一个更具体的示例吗?我添加了我的想法,不确定这是否有帮助