Обобщения типа Typescript - несколько типов в зависимости от общего ключа - PullRequest
1 голос
/ 21 февраля 2020

Я пытаюсь решить проблему с электронным приложением, которое использует довольно много IP C каналов. Для каждого канала у нас есть 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 и response или сопоставлен с чем-либо другим, кроме object. Есть ли решение ограничить значения карты определенными типами?

...