枚举类型和字面量类型都是用于表示一组有限的常量值,但它们有一些区别:
1. 枚举类型:
成员编号: 枚举类型的成员具有从 0 开始的默认编号,也可以手动指定编号。
enum Direction {
Up, // 0
Down, // 1
Left, // 2
Right // 3
}
反向映射: 枚举类型提供了从值到成员名称的反向映射。
let directionName: string = Direction[2]; // "Left"
运行时存在: 枚举在运行时会被转换为真正的 JavaScript 对象。
2. 字面量类型:
直接值约束: 字面量类型直接约束变量、参数或属性的值必须是特定的字面量值。
let status: "success" | "error";
没有默认编号: 字面量类型没有默认的编号,它直接使用字面量值本身。
let color: "red" | "green" | "blue";
不生成 JavaScript 对象: 字面量类型在编译后不会生成真正的 JavaScript 对象,它们只是在类型检查阶段用于约束值的类型。
const enum Colors {
Red,
Green,
Blue
}
let color: Colors = Colors.Green;
3. 常量枚举:
枚举的一种特殊形式: 常量枚举是枚举的一种特殊形式,通过添加 const
关键字创建。
const enum Colors {
Red,
Green,
Blue
}
在编译时被删除: 常量枚举在编译时会被删除,只保留成员的实际值,以提高性能。
let color: Colors = Colors.Green; // 编译后直接变成 let color = 1;
总的来说,枚举类型适用于需要一组有序编号的常量值,而字面量类型适用于直接约束变量为特定的字面量值。常量枚举是一种特殊的枚举形式,用于提高性能。选择使用枚举类型还是字面量类型取决于你的需求和代码设计。