注意: 如果您是 TypeScript 新手,请先查看我们的 TypeScript 入门 教程。
在 TypeScript 中,枚举(enumeration)是一种数据类型,它允许你设置一组命名常量。
下面是一个枚举的简单示例。你可以阅读本教程的其余部分以了解更多信息。
示例
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT"
}
// Using the enum to set a direction
const currentDirection = Direction.Up;
console.log("Moving in direction:", currentDirection);
// Output: Moving in direction: UP
这里,Direction
是一个 enum
,其可能值为 "UP"
、"DOWN"
、"LEFT"
和 "RIGHT"
,我们使用 Direction.Up
来设置移动方向。
声明一个枚举
要声明一个 enum
,你需要使用 enum
关键字,后跟 enum
的名称。
enum enumName {
// Set of named members
}
每个成员都可以是数值或字符串值,具体取决于你定义的 enum
的类型。
枚举的类型
枚举有两种类型。
- 数字枚举
- 字符串枚举
让我们来详细了解一下。
数字枚举
在数字枚举中,我们将相关的数字常量分组到一个名称下。
默认情况下,数字 enum
的第一个成员被赋值为 0,后续每个成员的值会递增一。
enum Level {
Low, // Automatically set to 0
Medium, // Automatically set to 1
High // Automatically set to 2
}
console.log(Level.Low);
console.log(Level.Medium);
console.log(Level.High);
输出
0 1 2
在这里,我们定义了一个名为 Level
的数字 enum
,它有三个成员:Low
、Medium
和 High
。
成员 | 值 |
---|---|
低 |
0 |
中 |
1 |
高 |
2 |
字符串枚举
字符串枚举允许你为 enum
成员分配字符串字面量,从而提供一种更有意义的方式来处理命名常量。
要定义一个字符串 enum
,每个成员都必须用字符串值进行初始化。
enum Color {
Red = "RED",
Green = "GREEN",
Blue = "BLUE"
}
let favoriteColor: Color = Color.Green;
console.log("Favorite Color is:", favoriteColor);
输出
Favorite Color is: GREEN
这里,Color
是一个 enum
,它有助于管理一组与颜色名称相关的预定义字符串值。
请注意,我们使用 Color
作为数据类型来定义 favoriteColor
变量。
let favoriteColor: Color = Color.Green;
这意味着 favoriteColor
只能被赋值为 Color
枚举中定义的其中一个值。
注意:枚举确保变量只从预定义的集合中赋值。
访问枚举值
你可以通过两种方式访问枚举值:
1. 直接成员访问
2. 索引访问
请看下面的例子。
enum Day {
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}
// Direct member access
console.log("First day of the week:", Day.Sunday);
// Index access using a variable,
let dayIndex = Day.Monday;
console.log("Second day of the week:", Day[dayIndex]);
输出
First day of the week: 0 Second day of the week: Monday
这里,
1. 直接成员访问
Day.Sunday
直接访问 enum
成员,由于它是第一个元素,它被自动赋值为数值 0。
2. 索引访问
Day[dayIndex]
使用索引变量(dayIndex
)来访问 enum
。这里,dayIndex
被设置为 1,对应于 Monday
,当使用时返回名称 "Monday"
。
为什么使用枚举?
枚举的使用原因有很多,以下列出其中一些。
1. 提高可读性
枚举通过为一组相关的值提供有意义的名称来提高可读性。例如,
使用枚举
enum Direction {
North = 0,
East = 1,
South = 2,
West = 3
}
function turn(direction: Direction) {
console.log("Turning", Direction[direction]);
}
turn(Direction.North);
// Output: Turning North
这里,Direction.North
立即传达了方向是北。
不使用枚举
function turn(direction: number) {
const directions = ["North", "East", "South", "West"];
console.log("Turning", directions[direction]);
}
turn(0);
// Output: Turning North
除非你查看数组定义,否则数字 0 代表什么并不清楚。
2. 减少错误
枚举可防止分配可能导致运行时错误的无效值。例如,
假设你需要在应用程序中管理用户访问级别。
enum AccessLevel {
Guest,
User,
Admin
}
function setAccessLevel(level: AccessLevel) {
console.log("Your access level:", AccessLevel[level]);
}
setAccessLevel(AccessLevel.Admin);
setAccessLevel(AccessLevel.Super_Admin); // This would cause a compile-time error, as 'Super_Admin' is not a valid AccessLevel
当你尝试传递 Super_Admin
(在 AccessLevel
枚举中未定义)时,会导致编译时错误。
3. 简化重构
更改枚举成员的值会更新代码库中的所有用法。
enum ServerStatus {
Offline,
Online,
Maintenance
}
function logStatus(status: ServerStatus) {
console.log("Server is currently", ServerStatus[status]);
}
logStatus(ServerStatus.Online);
输出
Server is currently Online
假设你需要向 ServerStaus
枚举添加一个新状态 Deprecated
,你可以这样做。
enum ServerStatus {
Offline,
Online,
Deprecated, // Newly added
Maintenance // Index has shifted, but usage is correct.
}
添加 Deprecated
不会破坏现有代码,因为即使其他状态(如 Maintenance
)的顺序发生变化,对它们的引用仍然是正确的。
另请阅读