在 TypeScript 中,枚举(Enum)是一种可用于定义一组具有名称和值的常量的数据类型。它们允许我们定义一组命名常量,而这些常量的值可以是数字,字符串或任何其他数据类型。枚举允许我们使用这些常量在我们的应用程序中进行类型安全的比较和赋值。
枚举可以看作是一个包含了一组具名值的对象,这些具名值在整个程序中是唯一的。枚举成员可以具有常量值、计算值或常量表达式。枚举成员可以是数字、字符串、甚至是布尔类型。当枚举成员的值为数字类型时,默认值是从 0 开始递增的。
enum Color {
Red,
Green,
Blue
}
console.log(Color.Red) // 0
console.log(Color.Green) // 1
console.log(Color.Blue) // 2
若指定第一个枚举成员的值,则后面的枚举成员的值会依次递增。
enum Color {
Red = 5 ,
Green,
Blue
}
console.log(Color.Red) // 5
console.log(Color.Green) // 6
console.log(Color.Blue) // 7
当然,也可以直接手动指定枚举成员的值。枚举成员的值除了可以为常量,也能是计算出来的结果
enum Color {
Red = 1,
Green = 2,
Blue = 4 + 1,
Black = "BLACK"
}
let color: Color = Color.Green;
console.log(color); // 2
console.log(Color[2]); // Green
console.log(Color.Blue) //5
console.log(Color.Black) //BLACK
console.log(Color['BLACK']) //undefined !!!
枚举成员可以使用枚举名来访问,也可以使用枚举的值来访问。在上面的示例中,我们将 Color.Green
赋值给变量 color
,并将其输出。输出结果是 2,这是因为 Green
的值为 2。我们也可以使用 Color[2]
来访问 Green
,这将返回字符串 "Green"。
!!!需注意的是,上方示例中通过"BALCK"访问Black时报错,打印出underfined,这是因为如果枚举成员的值是字符串,那么在 TypeScript 中是不能通过枚举成员的值来访问该成员的,只能通过枚举成员的名称来访问。
***枚举前的关键字
1.const
在TypeScript中,可以使用const
关键字来创建const枚举,与常规枚举的区别在于,在编译时会将其内联,而不会在运行时创建对象。这意味着无法在运行时使用const
枚举的属性名称来访问枚举的值。
const enum Directions {
Up,
Down,
Left,
Right,
}
在上面的示例中,Directions
被定义为const枚举。因此,在编译时,Directions
将被内联为数字常量。在运行时,Directions
将不存在。
!!!注意,使用const
关键字创建的枚举不支持计算成员。如果枚举中包含计算成员,则需要使用常规枚举。
2.decalare
在 TypeScript 中,declare
关键字通常用于声明不需要编译的实体,例如全局变量、函数、对象等。因此,如果我们需要引入第三方库或其他模块中已经存在的全局变量,就可以使用 declare
来声明这些变量,避免 TypeScript 抛出编译错误。
在声明枚举时,declare
通常用于声明全局枚举,即在模块中定义枚举,并在另一个模块中使用。在这种情况下,枚举定义不需要编译到 JavaScript 文件中,而只是用于类型检查。具体示例如下:
// colors.d.ts
declare enum Colors {
Red = '#FF0000',
Green = '#00FF00',
Blue = '#0000FF'
}
// app.ts
import { Colors } from './colors';
console.log(Colors.Red); // '#FF0000'
在上述示例中,colors.d.ts
中定义了一个枚举 Colors
,它的成员值都是字符串类型。由于在声明时使用了 declare
关键字,因此在编译成 JavaScript 文件时不会将 Colors
枚举转换为实际代码,而是只作为类型声明使用。在 app.ts
中,我们通过 import
关键字将 Colors
枚举导入,并可以使用它的成员值进行操作。
需要注意的是,在使用 declare
声明全局枚举时,不需要使用 export
关键字导出枚举,因为枚举本身就是全局可见的。同时,在使用全局枚举时,也不需要使用命名空间等方式进行引用,只需要直接使用枚举名即可。