枚举
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
- 与生成协议、旧代码或框架约定一致时。
- 需要声明合并扩展枚举成员(少见)。
相关链接
- 基础类型(字面量类型)
- 类型推断与类型守卫(可辨识联合常替代字符串枚举)
- 接口与类型别名(用枚举作属性类型)
- tsconfig配置(
isolatedModules、preserveConstEnums)