TypeScript 枚举

枚举(enum)用来定义一组有名字的常量,例如状态、方向、颜色等。它能把散落的「魔法数字」集中管理,让代码可读性更高、更不易写错。

数字枚举

未赋初值时,成员从 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,
  Success, // 2
  Failed,  // 3
}
console.log(Status.Pending); // 输出:1
console.log(Status.Success); // 输出:2

字符串枚举

字符串枚举的每个成员必须显式赋值。它没有反向映射,但打印出的值语义更清晰:

enum Color {
  Red = "RED",
  Green = "GREEN",
  Blue = "BLUE",
}
let c: Color = Color.Green;
console.log(c); // 输出:GREEN

异构枚举

数字与字符串成员可以混用,但这种写法容易引起困惑,实际项目里不建议使用:

enum Mixed {
  No = 0,
  Yes = "YES",
}
console.log(Mixed.No, Mixed.Yes); // 输出:0 YES

用枚举管理业务状态

枚举最常见的用途是表达业务状态,配合 switch 分支既清晰又安全:

enum OrderState {
  Created = 1,
  Paid,
  Shipped,
  Done,
}
function describe(state: OrderState): string {
  switch (state) {
    case OrderState.Created: return "订单已创建";
    case OrderState.Paid: return "已付款";
    case OrderState.Shipped: return "已发货";
    default: return "已完成";
  }
}
console.log(describe(OrderState.Paid)); // 输出:已付款

小结

枚举把有业务含义的常量变成有名字的成员:数字枚举适合排序或计数,字符串枚举适合输出可读的日志。需要一组固定选项时,枚举能让代码自我解释。

笔记加载中…