跳到主要内容

枚举

enum 如何定义有限取值?​

  • 场景: 取值被限制在一定范围内的常量集合;
  • 默认值: 成员从 0 开始依次递增;
  • 双向映射: 编译结果同时保存"名 → 值"与"值 → 名"两个方向;
enum Directions {
Up,
Down,
Left,
Right,
}

Directions[0]; // "Up"
Directions["Up"]; // 0

手动赋值有哪些规则?​

  • 递增规则: 未手动赋值的成员, 按上一个成员的值加一;
  • 重复值: 手动赋值可能造成成员值重复, 编译器不报错, 应人工避免;
enum Directions2 {
Up = 3,
Down = 2,
Left, // 3
Right, // 4
}

为什么推荐用 as const 替代 enum?​

  • 问题: enum 无法被翻译成原生 JavaScript, 是 TypeScript 独有语法;
  • 替代: 用 as const 声明普通对象, 取值仍是字面量类型;
const Directions3 = { Up: 3, Down: 2, Left: 1, Right: 0 } as const;

type Direction = (typeof Directions3)[keyof typeof Directions3]; // 3 | 2 | 1 | 0
  • 收益: 产物是普通对象, 去掉运行时枚举对象, 类型信息仍由 as const 保留;
  • 相关: 只需类型的场景见 字面量类型;