Typescript泛型-取决于公共密钥的多种类型

时间:2020-02-21 12:12:39

标签: typescript generics electron ipc

我尝试解决使用大量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以外的任何其他位置。是否有解决方案将映射值限制为某些类型?

0 个答案:

没有答案