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)); // 输出:已付款
小结
枚举把有业务含义的常量变成有名字的成员:数字枚举适合排序或计数,字符串枚举适合输出可读的日志。需要一组固定选项时,枚举能让代码自我解释。