【问题标题】:Map enum values to individual types in TypeScript将枚举值映射到 TypeScript 中的各个类型
【发布时间】: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


    【解决方案1】:

    对象字面量(以及接口和对象类型)可以具有计算键。例如:

    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,
      // ...
    };
    

    【讨论】:

    • 有没有办法“键入类型”,或者确保所有EventType 键都包含在EventTypeLut 中?
    猜你喜欢
    • 2019-04-09
    • 1970-01-01
    • 2018-08-01
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多