枚举

enum 编译为运行时代码(数字或字符串对象),与联合字面量 + const 对象相比各有取舍;不少风格指南倾向后者以减少打包体积与魔法行为。


数字枚举

enum Dir {
  Up, // 0
  Down, // 1
}
  • 可手动指定初值,后续自动递增。
  • 反向映射:仅数字枚举在 JS 输出上会有「值→名」映射,易让不熟悉者困惑。

字符串枚举

enum Theme {
  Light = 'light',
  Dark = 'dark',
}

无双射反向映射;更贴近「具名字符串常量」。


const enum

编译期内联,不生成 enum 对象;若 isolatedModules 或跨包边界使用不当可能踩坑。参见 tsconfig配置


与联合字面量的对比

type Theme = 'light' | 'dark' // [[基础类型]] 字面量联合
const Theme = { Light: 'light', Dark: 'dark' } as const

联合在类型侧轻量;需运行时常量对象时用 as const + typeof 导出类型。


何时仍用 enum

  • 与生成协议、旧代码或框架约定一致时。
  • 需要声明合并扩展枚举成员(少见)。

相关链接