枚举
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保留; - 相关: 只需类型的场景见 字面量类型;