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”。其特性和类别得到了很好的解释,并且针对所讨论的每种类型的枚举也共享了示例。