高级类型
枚举 (Enum)
学习数字枚举、字符串枚举、常量枚举
枚举 (Enum)
枚举定义一组命名常量,增加代码可读性。
学完本章你将: 掌握数字枚举、字符串枚举、常量枚举。
数字枚举
typescript
// 默认从 0 递增
enum Direction {
Up, // 0
Down, // 1
Left, // 2
Right, // 3
}
console.log(Direction.Up); // 0
console.log(Direction[2]); // "Left"(反向映射)
// 指定起始值
enum Status {
Pending = 1,
Approved, // 2
Rejected, // 3
}
字符串枚举
typescript
// 每个成员必须初始化
enum Color {
Red = "RED",
Green = "GREEN",
Blue = "BLUE",
}
console.log(Color.Red); // "RED"
// 没有反向映射
常量枚举
typescript
// 编译时内联,不生成额外代码
const enum HttpCode {
OK = 200,
NotFound = 404,
ServerError = 500,
}
const status = HttpCode.OK; // 编译后直接变成 const status = 200;
// 实战
const enum LogLevel {
Debug,
Info,
Warn,
Error,
}
function log(level: LogLevel, msg: string): void {
if (level >= LogLevel.Warn) {
console.warn(msg);
}
}
异构枚举与计算成员
typescript
// 混合枚举(不推荐)
enum Mixed {
No = 0,
Yes = "YES",
}
// 计算成员
enum FileAccess {
None = 0,
Read = 1 << 0, // 1
Write = 1 << 1, // 2
ReadWrite = Read | Write, // 3
}
console.log(FileAccess.ReadWrite); // 3
enum vs union
| 特性 | enum | union |
|---|---|---|
| 运行时存在 | ✅ | ❌ |
| 反向映射 | ✅ | ❌ |
| 包体积 | 有开销 | 零开销 |
| 灵活性 | 低 | 高 |
typescript
// 现代 TS 推荐用 as const + union
const Status = {
Active: "active",
Inactive: "inactive",
} as const;
type Status = (typeof Status)[keyof typeof Status];
// "active" | "inactive"