TypeScript 枚举:数字枚举与字符串枚举
TypeScript 枚举(Enums)是 TypeScript 提供的一种类型安全的枚举类型,用于定义一组命名的常量。枚举在实际开发中非常有用,可以提升代码的可读性和可维护性。本文将详细介绍 TypeScript 中的两种枚举类型:数字枚举和字符串枚举,并通过示例说明它们的使用方法和注意事项。
一、数字枚举
1.1 基本定义
数字枚举是 TypeScript 中最常见的一种枚举类型。它默认从 0 开始,依次递增。你可以通过显式指定枚举成员的值来覆盖默认行为。
enum Color {
Red = 1,
Green = 2,
Blue = 3
}
在上面的例子中,Color.Red 的值为 1,Color.Green 的值为 2,Color.Blue 的值为 3。
1.2 使用枚举
你可以通过枚举名和成员名来访问枚举值:
console.log(Color.Red); // 输出: 1
console.log(Color.Green); // 输出: 2
console.log(Color.Blue); // 输出: 3
你也可以通过枚举值来获取枚举成员名:
console.log(Color[1]); // 输出: "Red"
console.log(Color[2]); // 输出: "Green"
console.log(Color[3]); // 输出: "Blue"
1.3 枚举的反向映射
TypeScript 会自动为枚举成员创建一个反向映射,即从枚举值到枚举成员名的映射。这在处理枚举值时非常有用。
enum Direction {
Up = 1,
Down = 2,
Left = 3,
Right = 4
}
function getDirectionName(direction: number): string {
return Direction[direction];
}
console.log(getDirectionName(1)); // 输出: "Up"
console.log(getDirectionName(2)); // 输出: "Down"
console.log(getDirectionName(3)); // 输出: "Left"
console.log(getDirectionName(4)); // 输出: "Right"
1.4 枚举的计算值
枚举成员的值可以是任意表达式,而不仅仅是数字。例如:
enum Status {
Active = "active",
Inactive = "inactive",
Pending = "pending"
}
console.log(Status.Active); // 输出: "active"
console.log(Status.Inactive); // 输出: "inactive"
console.log(Status.Pending); // 输出: "pending"
1.5 枚举的计算值与数字枚举的混合使用
你可以在枚举中混合使用数字和计算值:
enum LogLevel {
Debug = 1,
Info = 2,
Warning = 3,
Error = 4
}
enum Status {
Active = LogLevel.Error + 1,
Inactive = LogLevel.Warning + 1
}
console.log(Status.Active); // 输出: 5
console.log(Status.Inactive); // 输出: 4
二、字符串枚举
2.1 基本定义
字符串枚举与数字枚举类似,但它的成员值是字符串类型。字符串枚举的默认值是空字符串 "",并且不能重复。
enum Direction {
Up = "up",
Down = "down",
Left = "left",
Right = "right"
}
在上面的例子中,Direction.Up 的值为 "up",Direction.Down 的值为 "down",Direction.Left 的值为 "left",Direction.Right 的值为 "right"。
2.2 使用枚举
你可以通过枚举名和成员名来访问枚举值:
console.log(Direction.Up); // 输出: "up"
console.log(Direction.Down); // 输出: "down"
console.log(Direction.Left); // 输出: "left"
console.log(Direction.Right); // 输出: "right"
你也可以通过枚举值来获取枚举成员名:
console.log(Direction["up"]); // 输出: "Up"
console.log(Direction["down"]); // 输出: "Down"
console.log(Direction["left"]); // 输出: "Left"
console.log(Direction["right"]); // 输出: "Right"
2.3 枚举的反向映射
字符串枚举同样会自动创建反向映射,即从枚举值到枚举成员名的映射。
enum Direction {
Up = "up",
Down = "down",
Left = "left",
Right = "right"
}
function getDirectionName(direction: string): string {
return Direction[direction];
}
console.log(getDirectionName("up")); // 输出: "Up"
console.log(getDirectionName("down")); // 输出: "Down"
console.log(getDirectionName("left")); // 输出: "Left"
console.log(getDirectionName("right")); // 输出: "Right"
2.4 枚举的计算值
字符串枚举的成员值可以是任意表达式,而不仅仅是字符串。例如:
enum Status {
Active = "active",
Inactive = "inactive",
Pending = "pending"
}
console.log(Status.Active); // 输出: "active"
console.log(Status.Inactive); // 输出: "inactive"
console.log(Status.Pending); // 输出: "pending"
2.5 枚举的计算值与字符串枚举的混合使用
你可以在枚举中混合使用字符串和计算值:
enum LogLevel {
Debug = "debug",
Info = "info",
Warning = "warning",
Error = "error"
}
enum Status {
Active = LogLevel.Debug + "Active",
Inactive = LogLevel.Warning + "Inactive"
}
console.log(Status.Active); // 输出: "debugActive"
console.log(Status.Inactive); // 输出: "warningInactive"
三、枚举的高级用法
3.1 枚举的联合类型
你可以将枚举类型与其他类型进行联合,以扩展枚举的使用范围。
enum Direction {
Up = "up",
Down = "down",
Left = "left",
Right = "right"
}
type Position = Direction | "center";
function move(direction: Position): void {
if (direction === "center") {
console.log("Move to center");
} else {
console.log(`Move ${direction}`);
}
}
move(Direction.Up); // 输出: Move up
move(Direction.Down); // 输出: Move down
move(Direction.Left); // 输出: Move left
move(Direction.Right); // 输出: Move right
move("center"); // 输出: Move to center
```
### 3.2 枚举的索引签名
你可以为枚举添加索引签名,以支持动态访问枚举成员。
```typescript
enum Direction {
Up = "up",
Down = "down",
Left = "left",
Right = "right"
}
type DirectionMap = {
[key: string]: Direction;
};
const directionMap: DirectionMap = {
up: Direction.Up,
down: Direction.Down,
left: Direction.Left,
right: Direction.Right
};
function getDirection(direction: string): Direction {
return directionMap[direction];
}
console.log(getDirection("up")); // 输出: "up"
console.log(getDirection("down")); // 输出: "down"
console.log(getDirection("left")); // 输出: "left"
console.log(getDirection("right")); // 输出: "right"
```
### 3.3 枚举的常量成员
你可以将枚举成员标记为常量,以确保其值在编译时就被确定下来。
```typescript
enum Direction {
Up = "up",
Down = "down",
Left = "left",
Right = "right"
}
const direction = Direction.Up;
function move(direction: typeof direction): void {
console.log(`Move ${direction}`);
}
move(direction); // 输出: Move up
四、枚举的注意事项
4.1 枚举的默认值
数字枚举的默认值是 0,字符串枚举的默认值是空字符串 ""。如果你不显式指定枚举成员的值,TypeScript 会自动使用默认值。
enum Direction {
Up,
Down,
Left,
Right
}
console.log(Direction.Up); // 输出: 0
console.log(Direction.Down); // 输出: 1
console.log(Direction.Left); // 输出: 2
console.log(Direction.Right); // 输出: 3
4.2 枚举的重复值
在数字枚举中,重复的值会导致编译错误。在字符串枚举中,重复的值会导致运行时错误。
enum Direction {
Up = "up",
Down = "down",
Left = "left",
Right = "right"
}
// 以下代码会导致编译错误
// enum Direction {
// Up = "up",
// Down = "up", // 重复的值
// Left = "left",
// Right = "right"
// }
4.3 枚举的计算值
枚举成员的值可以是任意表达式,而不仅仅是数字或字符串。例如:
enum Status {
Active = "active",
Inactive = "inactive",
Pending = "pending"
}
enum LogLevel {
Debug = Status.Active + "Debug",
Info = Status.Inactive + "Info",
Warning = Status.Pending + "Warning"
}
console.log(LogLevel.Debug); // 输出: "activeDebug"
console.log(LogLevel.Info); // 输出: "inactiveInfo"
console.log(LogLevel.Warning); // 输出: "pendingWarning"
五、总结
TypeScript 枚举是一种非常实用的类型安全工具,可以帮助你定义一组命名的常量。数字枚举和字符串枚举各有其适用场景,你可以根据实际需求选择合适的枚举类型。通过合理使用枚举,你可以提升代码的可读性和可维护性,减少错误的发生。

暂无评论,快来抢沙发吧!