我有一段 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
Run Code Online (Sandbox Code Playgroud)
是否可以以某种方式将 的值映射EventType
到相应的接口?如果不能自动完成,是否可以手动指定枚举值映射的类型?
我确实知道可以将值映射到类型,如这个问题所示。使用下面所示的方法,它可以创建我需要的查找表:
type EventTypeLut = {
'eventA': EventA,
'eventB': EventB,
// ...
};
Run Code Online (Sandbox Code Playgroud)
但此方法将 enum 的值硬编码到 LUT 中。枚举值将来可能会发生变化(我没有太多控制权),并且对枚举值进行硬编码使其更难以维护。
当我尝试用作EventType.EVENT_A
键名时,TypeScript 抱怨“需要属性或签名”。使用模板字符串似乎也无济于事。(似乎无法计算键名,即使它是像 这样的常量表达式1+2
。)
我尝试这样做的原因是我想创建一个具有名称EventEmitter
的枚举值EventType
和回调函数的相应类型对象的类型。如果有更好的方法来实现这一点,还请指点。提前致谢。
对象字面量(以及接口和对象类型)可以具有计算出的键。例如:
const obj = {
[2 + 2]: 'four'
};
obj[2 + 2] === 'four'; // true
obj[1 + 3] === 'four'; // true
obj[4] === 'four'; // true
obj['4'] === 'four'; // true
Run Code Online (Sandbox Code Playgroud)
计算键是括在方括号中的表达式,可用作对象字面量、接口或对象类型的键。EventTypeLut
尝试为您的对象类型使用计算键:
type EventTypeLut = {
[EventType.EVENT_A]: EventA,
[EventType.EVENT_B]: EventB,
// ...
};
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5004 次 |
最近记录: |