【发布时间】:2020-11-19 03:42:23
【问题描述】:
我有一段这样的 TypeScript 代码:
enum EventType {
EVENT_A = 'eventA',
EVENT_B = 'eventB',
... // more event types
}
interface Event {
type: EventType;
}
interface EventA extends Event {
type: EventType.EVENT_A;
data: PayloadForEventA;
}
interface EventB extends Event {
type: EventType.EVENT_B;
data: PayloadForEventB;
id: number;
}
... // More Event interfaces
是否可以以某种方式将EventType 的值映射到相应的接口?如果不能自动完成,是否可以手动指定枚举值映射的类型?
我知道可以将值映射到类型,如this question 所示。并使用如下所示的方法,它可以创建我需要的查找表:
type EventTypeLut = {
'eventA': EventA,
'eventB': EventB,
// ...
};
但是这种方法将枚举的值硬编码到 LUT 中。枚举值将来可能会发生变化(我没有太多控制权),并且对枚举值进行硬编码会使其更难维护。
当我尝试使用 EventType.EVENT_A 作为键名时,TypeScript 抱怨“需要属性或签名”。使用模板字符串似乎也无济于事。 (似乎无法计算键名,即使它是像1+2 这样的常量表达式。)
我试图这样做的原因是我想创建一个类型化的EventEmitter,枚举值EventType 作为名称和回调函数的相应类型化对象。
如果有更好的方法来实现这一点,也请给出提示。提前致谢。
【问题讨论】:
标签: typescript enums