我尝试解决使用大量IPC通道的电子应用程序中的问题。对于每个通道,我们都有一个tupel(channelName,有效负载,结果),有效负载和结果的类型都取决于通道名称。使用该频道的一个示例如下:
const result = ipcRenderer.sendSync('channel-1', {value: 'hello'}) // result could be: {name: 'world'}
因此,计划是为该方法找到一个新的类型定义,以使其具有已检查的有效负载类型并让打字稿推断出结果-两者均基于通道名称。
我的实际解决方案是这样的。它可以解决大多数问题,但希望能有所帮助,请参见下文。
import {ipcRenderer} from 'electron'
interface HelloWorldTypes {
payload: { value: string; };
response: { name: string; }
}
interface RequestResponseTypes {
'channel-1': HelloWorldTypes;
}
interface TypedIpcRenderer {
sendSync<C extends keyof RequestResponseTypes>(
channel: C,
payload: RequestResponseTypes[C]['payload']
): RequestResponseTypes[C]['response'];
}
let ipc: TypedIpcRenderer = ipcRenderer;
const result = ipc.sendSync('channel-1', {value: 'hello'});
我对'response'
和'payload'
的技巧不满意,特别是现在我可以将频道名称映射到没有payload
和{{1}的任何类型}属性或将其映射到response
以外的任何其他位置。是否有解决方案将映射值限制为某些类型?