typescript - 如何从类型映射中推断类型
问题描述
我不知道如何确保onEvent
函数的类型安全。
enum MyEnum {
One,
Two
}
type Payloads = {
[MyEnum.One]: { iAmOne: string; one: number };
[MyEnum.Two]: { iAmTwo: string; two: number };
};
interface BetEvent<ENUM extends MyEnum> {
type: ENUM;
payload: Payloads[ENUM];
}
const onEvent = (ev: BetEvent<any>) => {
if (ev.type === MyEnum.Two) {
ev.type; // should be MyEnum.Two
ev.payload; // should be { iAmTwo: string; two: number };
ev.payload.iAmOne; // should throw Error
}
};
解决方案
干得好...
enum BetEventType {
One,
Two
}
type BetPayloads = {
[BetEventType.One]: { iAmOne: string; one: number };
[BetEventType.Two]: { iAmTwo: string; two: number };
};
type BetEvent = {
[T in BetEventType]: {
type: T,
payload: BetPayloads[T]
}
}[BetEventType]
const onEvent = (ev: BetEvent) => {
if (ev.type === BetEventType.Two) {
ev.type; // is BetEventType.Two
ev.payload; // is { iAmTwo: string; two: number };
ev.payload.iAmOne; // gives compile error
}
};
我知道有一个公认的答案,但这个答案无疑更好,因为......
- 没有运行时开销(意味着在将要执行的编译代码中没有添加)
- 更好
BetEvent
的类型,因为它是所有可能事件类型的良好结合(悬停以查看我在说什么)
您应该考虑将此标记为已接受
推荐阅读
- ruby-on-rails - 从 iNaturalist 获得 API 授权
- python - 使用 python 连接到 Outlook 并阅读电子邮件和附件,然后将它们写入输出文件
- c - Node *head 与 Node **head 有什么区别?
- mysql - 需要mysql select语句帮助
- c++ - 如何将 const 应用于 C++ 中参数列表之外的模板参数类型?
- python - 如何最大化功能?
- php - 将带有表单的数据库中的数据发布回数据库PHP
- xamarin - Xamarin Essentials 地理定位和地理编码
- vue.js - 如何在使用 jest 测试 vuetify 组件时解决“SyntaxError: Unexpected identifier”
- python - 用于聚合和可视化数据的交互式应用程序:pandas+绘图库是正确的工具吗?