我有一段 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
到相应的接口?如果不能自动完成,是否可以手动指定枚举值映射的类型?
我确实知道可以将值映射到类型,如下所示这个问题 https://stackoverflow.com/questions/48914818/mapping-enum-to-type。使用下面所示的方法,它可以创建我需要的查找表:
type EventTypeLut = {
'eventA': EventA,
'eventB': EventB,
// ...
};
但此方法将 enum 的值硬编码到 LUT 中。枚举值将来可能会发生变化(我没有太多控制权),并且对枚举值进行硬编码使其更难以维护。
当我尝试使用时EventType.EVENT_A
作为键名,TypeScript 抱怨“需要属性或签名”。使用模板字符串似乎也无济于事。 (似乎无法计算键名称,即使它是像这样的常量表达式1+2
.)
我尝试这样做的原因是我想创建一个类型化的EventEmitter
枚举值为EventType
作为回调函数的名称和相应的类型对象。
如果有更好的方法来实现这一点,还请指点。提前致谢。
除了 @chharvey 的答案之外,您还可以确保所有EventType
键包含在EventTypeLut
通过做类似的事情:
type EventTypeLut = {
[T in EventType]: {
[EventType.EVENT_A]: EventA,
[EventType.EVENT_B]: EventB,
}[T]
};
The [T in Event]
如果未提供所有枚举成员,将导致 TypeScript 抱怨。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)