数字枚举是最常见的枚举类型,默认情况下,第一个枚举成员的值为 0
,后续成员的值递增。
enum Direction {
Up,
Down,
Left,
Right
}
let dir: Direction = Direction.Up;
console.log(dir); // 输出:0
你也可以手动设置枚举成员的值,后续成员的值会从指定的值开始递增。
enum Direction {
Up = 1,
Down,
Left,
Right
}
let dir: Direction = Direction.Up;
console.log(dir); // 输出:1
你还可以为每个成员指定不同的值。
enum Direction {
Up = 1,
Down = 3,
Left = 5,
Right = 7
}
let dir: Direction = Direction.Left;
console.log(dir); // 输出:5
字符串枚举的每个成员都必须用字符串字面量初始化。字符串枚举的优点是更易于调试和阅读。
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT"
}
let dir: Direction = Direction.Up;
console.log(dir); // 输出:"UP"
异构枚举是指同时包含数字和字符串成员的枚举。虽然可以定义异构枚举,但在大多数情况下,不建议这样做,因为它可能会导致代码的可读性和可维护性下降。
enum BooleanLikeHeterogeneousEnum {
No = 0,
Yes = "YES"
}
let boolEnum: BooleanLikeHeterogeneousEnum = BooleanLikeHeterogeneousEnum.Yes;
console.log(boolEnum); // 输出:"YES"
对于数字枚举,TypeScript 会生成反向映射。这意味着你可以通过枚举的值来获取对应的名称。
enum Direction {
Up,
Down,
Left,
Right
}
console.log(Direction.Up); // 输出:0
console.log(Direction[0]); // 输出:"Up"
字符串枚举不会生成反向映射。
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT"
}
// 这行代码会报错,因为字符串枚举没有反向映射
// console.log(Direction["UP"]);
常量枚举使用 const enum
声明,编译时会被内联,从而减少额外的代码开销。
const enum Direction {
Up,
Down,
Left,
Right
}
let directions = [Direction.Up, Direction.Down, Direction.Left, Direction.Right];
console.log(directions); // 输出:[0, 1, 2, 3]
枚举成员可以是常量成员或计算成员。常量成员在编译时确定,计算成员在运行时计算。
enum FileAccess {
// 常量成员
None,
Read = 1 << 1,
Write = 1 << 2,
ReadWrite = Read | Write,
// 计算成员
G = "123".length
}
console.log(FileAccess.None); // 输出:0
console.log(FileAccess.Read); // 输出:2
console.log(FileAccess.ReadWrite); // 输出:6
console.log(FileAccess.G); // 输出:3
枚举在很多场景中都很有用,例如状态管理、方向指示、事件类型等。
enum Status {
Idle,
Loading,
Success,
Error
}
function handleStatus(status: Status) {
switch (status) {
case Status.Idle:
console.log("Idle");
break;
case Status.Loading:
console.log("Loading");
break;
case Status.Success:
console.log("Success");
break;
case Status.Error:
console.log("Error");
break;
}
}
handleStatus(Status.Loading); // 输出:"Loading"
enum Direction {
Up,
Down,
Left,
Right
}
function move(direction: Direction) {
switch (direction) {
case Direction.Up:
console.log("Moving up");
break;
case Direction.Down:
console.log("Moving down");
break;
case Direction.Left:
console.log("Moving left");
break;
case Direction.Right:
console.log("Moving right");
break;
}
}
move(Direction.Left); // 输出:"Moving left"
枚举是 TypeScript 中非常有用的特性,提供了一种便捷的方式来定义和使用一组相关的常量。无论是数字枚举、字符串枚举还是异构枚举,都可以提高代码的可读性和可维护性。通过合理地使用枚举,可以使代码更加清晰、易于理解和调试。