簡體   English   中英

將枚舉值映射到 TypeScript 中的各個類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM