首页 > 解决方案 > 如何在 Typescript 中增加枚举?

问题描述

假设 MyEnum 是这种类型的 TS 枚举(数字,连续):

export enum MyEnum { 
    optionOne, 
    optionTwo,
    // more opions ...
}

我想将它加一并将结果用作下一个方法调用的参数。这使编译器高兴:

private DoSomething(currentValue: MyEnum): void {
    let nextEnumValue = <MyEnum>(<number><unknown>currentValue + 1);
    this.DoMore(nextEnumValue);
}

private DoMore(currentValue: MyEnum): void {
    // Something ...
}

是否有更简单(且类型更安全)的获取方式nextEnumValue

标签: typescriptenumstype-conversion

解决方案


我建议将此行为保留枚举中,以便在对值进行任何更改时更明显地需要更新(或至少审查)它。例如,在这里使用 Fenton 的回答中的命名空间理念:

enum Color {
    RED,
    GREEN,
    BLUE
}

namespace Color {
  export function after(value: Color): Color {
      return value + 1;
  }
}

// In use
const color: Color = Color.after(Color.RED);

这不需要任何类型断言(因为Coloris 实际上0 | 1 | 2是 的子集number),并且如果您向枚举添加非数字值,则会开始引发编译器错误。但是请注意,编译器在更改非连续但仍然是数值时不会出现问题,例如更改为位标志样式值:

enum Color {
  RED = 1,
  GREEN = 2,
  BLUE = 4
}

您必须进行其他测试才能发现此类问题。它也没有处理这样一个事实,无论哪种方式,Color.after(Color.BLUE)都没有有意义的价值。

操场


推荐阅读