Я пытаюсь реализовать обработчик сообщений, используя сопоставленные типы. Проблема в том, что функция handleMessage
ниже не компилируется. Я понимаю, почему он не печатает проверку, но я думаю, что это разумный вариант использования. Возможно ли вообще реализовать handleMessage
или подобное в TypeScript?
type Message = { id: "A", value: string } | { id: "B", value: number };
type MessageIds = Message["id"];
type MessageCase<K extends MessageIds> = Message & { id: K };
type MessageHandler<K extends MessageIds> = (message: MessageCase<K>) => MessageCase<K>;
type MessageHandlers = {
readonly [K in MessageIds]: MessageHandler<K>;
}
const messageHandlers: MessageHandlers = {
A(message: MessageCase<"A">): MessageCase<"A"> {
return {
id: "A",
value: message.value.toUpperCase(),
};
},
B(message: MessageCase<"B">): MessageCase<"B"> {
return {
id: "B",
value: message.value * 2,
};
},
};
function handleMessage<K extends MessageIds>(message: MessageCase<K>): MessageCase<K> {
return messageHandlers[message.id](message);
}
const x: MessageCase<'A'> = { id: 'A', value: '1' }
- person captain-yossarian   schedule 18.03.2021