【问题标题】:How to increment an Enum in Typescript?如何在 Typescript 中增加枚举?
【发布时间】:2020-09-03 08:33:06
【问题描述】:

假设,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

【问题讨论】:

  • 你使用的是什么枚举类型?
  • @tmhao2005 类似于export enum MyEnum { optionOne, optionTwo }
  • @jonrsharpe 我知道这是一个相当少见的用例,但我手头有一个。
  • @jonrsharpe 我的用例是一个数字、连续的枚举,与上面的完全一样,只是有更多的值。

标签: typescript enums type-conversion


【解决方案1】:

我建议将这种行为 一起保留在枚举中,以便在对值进行任何更改时更明显地需要更新(或至少审查)它。比如使用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 | 2number 的一个子集),如果您向枚举添加非数字值,则会开始引发编译器错误。但是请注意,编译器不会在更改非连续但仍然是数值时遇到问题,例如更改为位标志样式的值:

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

您必须进行其他测试才能发现此类问题。它也没有处理Color.after(Color.BLUE) 没有有意义的值这一事实。

Playground

【讨论】:

猜你喜欢
  • 2020-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2017-02-08
相关资源
最近更新 更多