TypeScript 词条目录
前端Wiki/TypeScript/基础/基础类型

枚举 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
本节要点枚举提供可遍历与反查;不要遍历就用字面量联合类型,零运行时成本。
🔗 相关词条JavaScriptCSS3HTML