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