什么是TypeScript枚举以及如何创建它们(附实例)

98 阅读2分钟

在这篇文章中,我们将介绍什么是TypeScript枚举以及如何创建它们。我们还将发现枚举的缺点,以及它们在哪些情况下工作得很好。

Enums in TypeScript

什么是枚举?

举是枚举的简称,是一种代表命名常量的类型。如果常量值的含义不明显,它可以使代码更容易理解。

考虑一下下面的例子:

if (status === 5) {
  // do something
}

if (status === JobStatus.Completed) {
  // do something
}

第二个if 语句使用了一个枚举。可以说,它比第一个if 语句更容易理解。

枚举的语法

枚举的语法如下:

enum TypeName {
    value1,
    value2,
    ...
}

类型名称跟在enum 关键字后面。然后在大括号内列出值的名称。

数值枚举

枚举的值默认是基于零的自动递增的数字。

请看下面的例子:

enum Level {
  High,
  Medium,
  Low,
}

我们可以通过将数值输出到控制台来验证Level 枚举代表一个基于零的自动递增的数字:

let level: Level;
level = Level.High;
console.log(level); // 0
level = Level.Medium;
console.log(level); // 1
level = Level.Low;
console.log(level); // 2

如果我们把枚举变量赋值给一个不是012 的数字,会怎么样?

level = 5; // ✅ no type error

没有发生类型错误!这也许不是我们所期望的。

数字枚举值不是强类型的,而是定义在枚举中的值。

所以,一般来说,数字枚举并不是一个很好的类型选择。

字符串枚举

如果我们在名称后面明确定义一个字符串值,那么枚举值可以是字符串的,比如说:

enum Level {
  High = "H",
  Medium = "M",
  Low = "L",
}

let level: Level;
level = Level.High;
console.log(level); // "H"
level = Level.Medium;
console.log(level); // "M"
level = Level.Low;
console.log(level); // "L"

如果我们把枚举变量分配给一个字符串,不是"H""M""L"

level = "VH"; // 💥 type error - type '"VH"' is not assignable to type 'Level'

这就更像了!

如果我们把level 设为Level 类型中的一个字符串,那会怎么样。

level = "H"; // ✅ no type error

所以,字符串枚举值强类型化为枚举中声明的命名值。

很好!

字符串字面联合体与字符串枚举

字符串字面联合就像字符串枚举一样,它们创建了一个特定字符串的狭窄类型。

type Level = "High" | "Medium" | "Low"

如果这些字符串是有意义的,并且不需要被映射到更有意义的东西上,那么字符串字面联合是创建类型的一种简洁的方式。当字符串值的含义不明显时,字符串枚举很有用,因为它可以被赋予一个有意义的名字,以帮助代码的可读性。

总结

枚举是一种可以使代码更加可读的类型,在这种情况下,变量值的含义并不明显。数字枚举对枚举中的值没有强类型,但字符串枚举是强类型。