枚举 enum
枚举(enum)给一组常量取可读名字。数字枚举默认从 0 自增,也可以指定起始值;字符串枚举调试时可读性更好。枚举会编译成真实的 JS 对象(带双向映射),const 枚举则在编译时被内联替换、运行时无痕迹。
现代项目更流行的替代方案是联合字面量类型:type Status = 'on' | 'off' 零运行时成本,且类型检查一样严格。枚举胜在可遍历、可反向查找(数字枚举),按需选择。
- 数字枚举默认 0 起自增,可指定起始值;支持反向查找
- 字符串枚举无反向映射,编译产物更干净,调试友好
- const enum 编译时内联,运行时不存在该对象;要遍历就用普通枚举
TS
enum Direction { Up, Right, Down, Left } // 0,1,2,3
console.log(Direction.Up); // 0
console.log(Direction[0]); // 'Up' 反向查找
enum HttpStatus { // 指定起始值
Ok = 200,
NotFound = 404,
}
enum Status { // 字符串枚举
Active = 'active',
Idle = 'idle',
}
const enum Color { Red, Green, Blue }
let c = Color.Red; // 编译后直接变成 0
// 零成本替代方案
type Theme = 'light' | 'dark' | 'auto';JS
// 数字枚举编译出双向映射对象 var Direction; (function (Direction) { Direction[Direction['Up'] = 0] = 'Up'; Direction[Direction['Right'] = 1] = 'Right'; Direction[Direction['Down'] = 2] = 'Down'; Direction[Direction['Left'] = 3] = 'Left'; })(Direction || (Direction = {})); console.log(Direction.Up); // 0 console.log(Direction[0]); // 'Up' // const enum Color.Red 已被内联成常量 0 console.log(0); // 原 Color.Red
本节要点枚举提供可遍历与反查;不要遍历就用字面量联合类型,零运行时成本。




