在这篇文章中,我们将介绍什么是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
如果我们把枚举变量赋值给一个不是0 、1 或2 的数字,会怎么样?
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"
如果这些字符串是有意义的,并且不需要被映射到更有意义的东西上,那么字符串字面联合是创建类型的一种简洁的方式。当字符串值的含义不明显时,字符串枚举很有用,因为它可以被赋予一个有意义的名字,以帮助代码的可读性。
总结
枚举是一种可以使代码更加可读的类型,在这种情况下,变量值的含义并不明显。数字枚举对枚举中的值没有强类型,但字符串枚举是强类型。