Z
ZHANK
高级类型

枚举 (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

特性enumunion
运行时存在
反向映射
包体积有开销零开销
灵活性
typescript
// 现代 TS 推荐用 as const + union
const Status = {
    Active: "active",
    Inactive: "inactive",
} as const;
type Status = (typeof Status)[keyof typeof Status];
// "active" | "inactive"