typescript - 使用映射类型在 TypeScript 中实现消息处理程序
问题描述
我正在尝试通过利用映射类型来实现消息处理程序。问题是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);
}
解决方案
推荐阅读
- php - 如何摆脱 laravel 错误控制台输出中的红色背景
- wpf - 如何在 WPF 中创建圆角 DataGrid 顶角?
- php - wp_redirect() 函数不会根据条件转到正确的位置
- botframework - 如何使用与机器人控制器相同的凭据保护通知控制器
- c# - 路径缩放动画上的低帧率 wpf(大量路径数据)
- python - 使用带有 Python 的 glob 重命名多个文件(文件已存在)
- javascript - 在 NodeJS 中使用 Express 和 Supertest 运行集成测试时如何创建/关闭服务器
- git - 如何让 git “看到” 使用 --single-branch 克隆的 repo 的远程分支?
- bash - 如何在它关闭的同一工作目录中打开终端?
- reactjs - TextField 调用 handleChange 两次