如何增加打字稿中的枚举?

时间:2020-09-03 08:33:06

标签: typescript enums type-conversion

让我们说,MyEnum是这种TS枚举(数字,连续):

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

,我想将其递增1,并将结果用作下一个方法调用的参数。这使编译器感到高兴:

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

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

是否有一种更简单(且类型安全)的方法来获取nextEnumValue

1 个答案:

答案 0 :(得分:2)

我建议将此行为保留为 枚举,这样,如果对值进行了任何更改,则很明显需要对其进行更新(或至少进行复审)。例如,使用Fenton's answer here中的命名空间提示:

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);

这不需要任何类型声明(因为Color实际上是0 | 1 | 2,是number的子集),并且如果添加非数字值,将开始引发编译器错误枚举。但是请注意,编译器将 not 更改为非连续但仍为数值的问题,例如更改为位标记样式的值:

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

您必须进行其他测试才能发现类似的问题。无论哪种方式,Color.after(Color.BLUE)都没有有意义的值。

Playground