[英]Map enum values to individual types in TypeScript
我有一段像這樣的 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
的值映射到相應的接口? 如果不能自動完成,是否可以手動指定枚舉值映射的類型?
我知道可以將值映射到此問題中所示的類型。 並使用下面顯示的方法,它可以創建我需要的查找表:
type EventTypeLut = {
'eventA': EventA,
'eventB': EventB,
// ...
};
但是這種方法將 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
計算鍵是括在括號中的表達式,可用作對象字面量、接口或對象類型的鍵。 嘗試為EventTypeLut
對象類型使用計算鍵:
type EventTypeLut = {
[EventType.EVENT_A]: EventA,
[EventType.EVENT_B]: EventB,
// ...
};
除了@chharvey 的回答,您還可以通過執行以下操作確保所有EventType
鍵都包含在EventTypeLut
中:
type EventTypeLut = {
[T in EventType]: {
[EventType.EVENT_A]: EventA,
[EventType.EVENT_B]: EventB,
}[T]
};
如果未提供所有枚舉成員, [T in Event]
將導致 TypeScript 抱怨。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.