TypeScript 枚举(Enums)是一种用于定义一组命名常量的方式。枚举可以使代码更具可读性和可维护性,特别是在需要表示一组相关值的场景下。TypeScript 提供了数种方式来定义枚举,包括数字枚举、字符串枚举、异构枚举以及常量枚举。下面详细介绍 TypeScript 枚举的各种用法。
数字枚举
数字枚举是 TypeScript 中最常见的枚举类型。默认情况下,枚举成员的值从 0
开始递增。
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
你也可以手动指定枚举成员的值,后续成员的值会从这个指定值开始递增。
enum Direction {
Up = 1,
Down,
Left,
Right
}
console.log(Direction.Up); // 输出: 1
console.log(Direction.Down); // 输出: 2
console.log(Direction.Left); // 输出: 3
console.log(Direction.Right); // 输出: 4
字符串枚举
字符串枚举的每个成员必须用字符串字面量进行初始化。这种方式提供了更清晰的语义。
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT"
}
console.log(Direction.Up); // 输出: "UP"
console.log(Direction.Down); // 输出: "DOWN"
console.log(Direction.Left); // 输出: "LEFT"
console.log(Direction.Right); // 输出: "RIGHT"
异构枚举
异构枚举允许混合使用字符串和数字成员。这种用法较少见,但在某些特定场景下可能会有用。
enum BooleanLikeHeterogeneousEnum {
No = 0,
Yes = "YES"
}
console.log(BooleanLikeHeterogeneousEnum.No); // 输出: 0
console.log(BooleanLikeHeterogeneousEnum.Yes); // 输出: "YES"
计算和常量成员
枚举成员可以是常量或计算值。常量成员是在编译时计算出的值,而计算成员则是在运行时计算的。
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.Write); // 输出: 4
console.log(FileAccess.ReadWrite); // 输出: 6
console.log(FileAccess.G); // 输出: 3
常量枚举
常量枚举使用 const
关键字定义,编译时会被完全移除。常量枚举只在性能优化上有用,特别是在频繁使用的情况下。
const enum Directions {
Up,
Down,
Left,
Right
}
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];
编译后的代码将不包含枚举定义,而是直接使用其值:
// 编译后的代码
var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];
反向映射
数字枚举成员不仅创建从名字到值的映射,还创建从值到名字的反向映射。
enum Enum {
A
}
console.log(Enum.A); // 输出: 0
console.log(Enum[0]); // 输出: "A"
反向映射仅适用于数字枚举成员,字符串枚举成员不提供这种特性。
枚举成员类型
枚举成员类型可以作为单独的类型使用,尤其在需要特定值的场景下。
enum ShapeKind {
Circle,
Square
}
interface Circle {
kind: ShapeKind.Circle;
radius: number;
}
interface Square {
kind: ShapeKind.Square;
sideLength: number;
}
let c: Circle = {
kind: ShapeKind.Circle,
radius: 100
};
总结
TypeScript 枚举提供了一种灵活和强大的方式来定义一组命名常量,使代码更加可读和易于维护。以下是总结的几点:
- 数字枚举:默认从
0
开始递增,可以手动指定值。 - 字符串枚举:每个成员用字符串字面量初始化,提供清晰的语义。
- 异构枚举:允许混合字符串和数字成员。
- 计算和常量成员:支持在编译时和运行时计算的成员。
- 常量枚举:使用
const
关键字定义,编译时移除以优化性能。 - 反向映射:数字枚举成员支持从名字到值和从值到名字的反向映射。
- 枚举成员类型:可以作为单独的类型使用。
通过掌握这些特性,你可以更有效地使用 TypeScript 枚举来构建强类型的应用程序。