TypeScript 中的枚举详解


在深入了解“枚举”之前,了解 TypeScript 中常用的“const”关键字至关重要。当我们声明一个“const”变量时,我们就不能更改赋给它的值。

因此,枚举只不过是这些 const 数据类型的集合。我们可以使用“enum”关键字创建枚举。Enum 是 Enumerations 的缩写,在枚举下声明的每个常量变量都称为该枚举的成员。

在本文中,我们将学习 TypeScript 中的枚举、其特性以及主要类型的枚举。

TypeScript 中枚举的特性

  • TypeScript 中的枚举有一个令人惊讶的特性。如果我们不为枚举的成员变量赋值,它们将默认使用它们的索引值作为值。

  • 枚举的每个成员都必须包含一个值。我们可以赋值一个常量,或者一个值也可以通过函数计算得出。如果以上情况都不存在,则枚举成员将存储默认的常量值。

  • 枚举成员也可以赋值常量表达式。TypeScript 中的任何常量表达式都在编译时而不是运行时进行计算。

  • 枚举可以作为参数传递给函数,通过函数计算,并返回给函数。

  • TypeScript 中的枚举支持反向映射的概念。通过反向映射,我们可以通过其值访问成员,也可以通过其索引成员访问值。这个概念背后的思想是,枚举对象在内部以两种方式存储成员:通过其变量引用值,以及通过值引用枚举变量。由于 TypeScript 通常将代码转换为 JavaScript,因此它支持反向映射。

  • 字符串枚举不支持反向映射;在异构枚举中,只有数字枚举支持反向映射。

  • Const 枚举类型在编译时被移除,并将被它们的值替换。因此,const 枚举比常规枚举更快,减少了在编译时生成额外代码的复杂性。但是我们只能在 const 枚举中使用常量成员,而不能使用计算成员。

枚举的类型

数字枚举

在这种类型的枚举中,枚举的成员被赋予数值。数字枚举具有自动递增的特性。例如,如果我们将数字 5 赋给枚举的第一个常量变量,那么接下来的常量变量将赋值递增 1 的值,例如,将 6 赋给枚举的第二个成员,将 7 赋给下一个成员,依此类推。

示例

在下面的示例中,我们创建了一个名为 color 的枚举类型。在 color 中,创建了四个 const 变量,名为 red、blue、yellow 和 pink。为了演示数字枚举的自动递增特性,我们为前两个 const 变量赋值,而将另外两个留作默认值。让我们看看输出中的默认值。

//enum type color
enum color{
   //assign numeric value
   red = 1,
   blue = 3,
   pink,
   yellow
}
//print const variables values
console.log(color.red);
console.log(color.blue);
console.log(color.pink);
console.log(color.yellow);

编译后,它将生成以下 JavaScript 代码

//enum type color
var color;
(function (color) {
   //assign numeric value
   color[color["red"] = 1] = "red";
   color[color["blue"] = 3] = "blue";
   color[color["pink"] = 4] = "pink";
   color[color["yellow"] = 5] = "yellow";
})(color || (color = {}));
//print const variables values
console.log(color.red);
console.log(color.blue);
console.log(color.pink);
console.log(color.yellow);

输出

以上代码将产生以下输出:

1
3
4
5

正如用户在输出中注意到的那样,blue 之后接下来的 const 变量会自动赋值递增 1 的默认值。

字符串枚举

字符串枚举类似于数字枚举,只是字符串枚举的值用字符串而不是数字赋值。字符串枚举不具有自动递增行为。

示例

在下面的示例中,我们创建了一个名为“names”的字符串类型枚举。在创建的枚举下,我们声明了四个变量 student1、student2、student3 和 student4。这些变量被赋予字符串字面量。字符串枚举类型中不存储默认的字符串值,如果未赋值,则只存储数字值作为默认值。

enum names{
//assign string literal
   student1 = "john",
   student2 = "srujana",
   student3 = "sam",
   student4 = "ram"
}
//print const variables values
console.log(names.student1);
console.log(names.student2);
console.log(names.student3);
console.log(names.student4);

编译后,它将生成以下 JavaScript 代码

var names;
(function (names) {
   //assign string literal
   names["student1"] = "john";
   names["student2"] = "srujana";
   names["student3"] = "sam";
   names["student4"] = "ram";
})(names || (names = {}));
//print const variables values
console.log(names.student1);
console.log(names.student2);
console.log(names.student3);
console.log(names.student4);

输出

以上代码将产生以下输出:

john
srujana
sam
ram

正如用户在输出中注意到的那样,前三个枚举变量是字符串类型。因此,这是一个字符串类型的枚举。

异构枚举

这是数字枚举和字符串枚举的组合。也就是说,在这种类型的枚举中,我们可以为其成员赋值字符串值或数值。

示例

在下面的示例中,我们创建了一个 student 类型的枚举。在 student 中有四个 const 变量:name、roll_no、gender 和 mob_no。name 和 gender 是文字字符串类型,而 roll_no 和 mob_no 是数值。

//enum type student
enum student{
   //assign string literal
   name = "srujana",
   roll_no = 15,
   gender = "female",
   mob_no = 9873890414
}
console.log(student.name);
console.log(student.roll_no);
console.log(student.gender);
console.log(student.mob_no);

编译后,它将生成以下 JavaScript 代码

//enum type student
var student;
(function (student) {
   //assign string literal
   student["name"] = "srujana";
   student[student["roll_no"] = 15] = "roll_no";
   student["gender"] = "female";
   student[student["mob_no"] = 9873890414] = "mob_no";
})(student || (student = {}));
console.log(student.name);
console.log(student.roll_no);
console.log(student.gender);
console.log(student.mob_no);

输出

以上代码将产生以下输出:

srujana
15
female
9873890414

在本文中,用户了解了 TypeScript 关键字“enum”。其特性和类别得到了很好的解释,并且针对所讨论的每种类型的枚举也共享了示例。

更新于:2023年1月3日

499 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告