TypeScript枚举类型用法 – TypeScript开发教程

上一章TypeScript教程请查看:TypeScript三种迭代语句
enum是TypeScript支持的一种新的数据类型。它用于定义一组命名常量,即,相关值的集合,TypeScript支持数字和基于字符串的枚举,我们可以使用enum关键字来定义枚举。
为什么使用枚举类型?enum在TypeScript中很有用,原因如下:

  • 它使得在未来改变值变得容易。
  • 它减少了由于输入或输入错误而引起的错误。
  • 它只在编译期间存在,因此不分配内存。
  • 使用JavaScript中的内联代码可以节省运行时和编译时。
  • 它允许我们创建与程序相关的常量。
  • 它将使开发人员能够在JavaScript中开发内存效率高的自定义常量,JavaScript不支持枚举,但TypeScript帮助我们访问它们。
TypeScript中有三种类型的枚举。这些都是:
TypeScript枚举类型用法 – TypeScript开发教程

文章图片
  • 数字枚举
  • 字符串枚举
  • 异构的枚举
数字枚举数字枚举是基于数字的枚举,它将值存储为数字。这意味着我们可以将数字分配给枚举的实例。
例子
enum Direction { Up = 1, Down, Left, Right, } console.log(Direction);

在这里,我们用1初始化,然后从该点开始自动递增所有下面的成员。这意味着方向。Up是1,Down是2,Left是3,Right是4。
我们可以声明enum而不需要初始化,如下所示。
enum Direction { Up, Down, Left, Right, }console.log(Direction);

在这里,Up的值为0,并且所有下面的成员都从该点开始自动递增。这意味着方向。上面是0,下面是1,左边是2,右边是3。当不需要关心成员值本身时,自动递增行为非常有用。但是每个值必须与同一枚举中的其他值不同。
我们可以向enum成员提供任何值,如下面的示例所示。
例子
enum Direction { Up=1, Down=3, Left=6, Right=10, } console.log(Direction);

Enum作为函数参数我们还可以使用enum作为函数类型或返回类型,如下面的示例所示。
enum AppStatus { ACTIVE, INACTIVE, ONHOLD } function checkStatus(status: AppStatus): void { console.log(status); } checkStatus(AppStatus.ONHOLD);

在上面的例子中,我们已经声明了enum AppStatus。接下来,我们创建一个函数checkStatus(),它接受一个返回enum AppStatus的输入参数status。在函数中,我们检查状态的类型。如果状态名匹配,则获得匹配的enum成员。
在这里,我们可以看到,在最后一条语句中输出的值“2”在大多数场景中没有多大用处。这就是推荐使用基于字符串的枚举的原因。
字符串枚举字符串枚举是与数字枚举类似的概念,除了枚举有一些细微的运行时差异。在字符串enum中,每个enum值都是用字符串文字或另一个字符串enum成员(而不是数值)常量初始化的。
字符串枚举没有自动递增行为。使用这个枚举的好处是字符串枚举提供了更好的可读性。如果我们正在调试一个程序,字符串枚举允许我们在代码运行时给出一个有意义的、可读的值,而不依赖于枚举成员本身的名称。
考虑下面的数字枚举示例,但它是用字符串枚举表示的:
例子
enum AppStatus { ACTIVE = 'ACT', INACTIVE = 'INACT', ONHOLD = 'HLD', ONSTOP = 'STOP' } function checkStatus(status: AppStatus): void {console.log(status); } checkStatus(AppStatus.ONSTOP);

在上面的示例中,我们声明了一个字符串enum AppStatus,其值与上面的数字enum相同。但是字符串枚举不同于数字枚举,后者的字符串枚举值是用字符串文本初始化的。这些枚举之间的区别在于数值枚举值是自动递增的,而字符串枚举值需要单独初始化。
异构的枚举异构枚举是同时包含字符串和数值的枚举。但是建议你不要这样做,除非需要利用JavaScript运行时行为。
例子
enum AppStatus { ACTIVE = 'Yes', INACTIVE = 1, ONHOLD = 2, ONSTOP = 'STOP' } console.log(AppStatus.ACTIVE); console.log(AppStatus.ONHOLD);

计算成员和常数成员我们知道每个enum成员都有一个与其关联的值,这些值可以是常量,也可以是计算值。如果:
1、它是enum的第一个成员,没有初始化值。在本例中,它被赋值为0。
例子
// Name.Hola is constant: enum Name { Hola } console.log(Name);

2、它没有初始化值,前面的enum成员是一个数值常量。在本例中,当前enum成员的值将是前一个enum成员的值加上1。
// 所有成员都是常量 enum Name { AA, BB, CC } enum Profile { Engineer=1, Leader, Businessman }

在TypeScript中,我们可以说一个表达式是常量enum表达式,如果它是:
  • 一个字面量enum表达式。
  • 对前面定义的常量enum成员的引用。
  • 括号中的常数枚举表达式。
  • 它是用于常量enum表达式的+、-、~一元运算符之一。
  • +, -, *, /, %, < < , >>, >>>, & , |, ^操作数为常数枚举表达式的二进制操作符。
在所有其他情况下,enum成员都被认为是经过计算的。下面的枚举示例包括具有计算值的枚举成员。
enum Weekend { Friday = 1, Saturday = getDate('Oreja'), Sunday = Saturday * 40 }function getDate(day : string): number { if (day === 'Oreja') { return 3; } } console.log(Weekend.Saturday); console.log(Weekend.Sunday);

反向映射TypeScript enums也支持反向映射。这意味着我们可以访问enum成员的值,也可以从其值访问成员名。我们可以从下面的例子中理解反向映射。
注意:字符串enum不支持反向映射。
例子
enum Weekend { Friday = 1, Saturday, Sunday } console.log(Weekend.Saturday); console.log(Weekend["Saturday"]); console.log(Weekend[3]);

枚举运行时枚举是运行时存在的实际对象。我们可以从下面的例子中理解它
enum E { A, B, C }

它实际上可以传递给函数,我们可以在下面的示例中看到。
function f(obj: { A: number }) { return obj.A; } f(E);

环境枚举我们可以使用环境枚举来描述已经存在的枚举类型的状态。
Declare enum Enum{ X=1, Y, Z=2 }

【TypeScript枚举类型用法 – TypeScript开发教程】 主要有一个区别,在环境和非环境的枚举。在常规枚举中,如果前面的枚举成员被认为是常量,那么没有初始化器的成员就被认为是常量。但是,没有初始化器的环境(和non-const)枚举成员通常被认为是计算枚举。

    推荐阅读