枚举的基本概念
枚举是一种在多种编程语言中都存在的数据类型,它可以帮助我们定义一组命名的常量。在 TypeScript 中,枚举不仅支持数字类型,还支持字符串和异构类型,这增强了枚举的灵活性和表达力。
数字枚举
数字枚举是 TypeScript 中最常用的枚举类型。默认情况下,数字枚举的第一个成员的值为 0,然后依次递增。
enum Color {
red, // 默认为 0
green, // 自动递增为 1
blue // 自动递增为 2
}
console.log(Color.red, Color.green, Color.blue); // 输出:0 1 2
自定义初始值
我们可以为枚举的第一个成员设定一个初始值,随后的成员将会按顺序递增。
enum Color {
red = 2,
green, // 自动递增为 3
blue // 自动递增为 4
}
console.log(Color.red, Color.green, Color.blue); // 输出:2 3 4
字符串枚举
字符串枚举的概念很简单。 在一个字符串枚举里,每个成员都必须用字符串字面量,或另外一个字符串枚举成员进行初始化。
由于字符串枚举没有自增长的行为,字符串枚举可以很好的序列化。 换句话说,如果你正在调试并且必须要读一个数字枚举的运行时的值,这个值通常是很难读的 - 它并不能表达有用的信息,字符串枚举允许你提供一个运行时有意义的并且可读的值,独立于枚举成员的名字。
enum Types {
Red = 'red',
Green = 'green',
Blue = 'blue'
}
异构枚举
异构枚举混合了字符串和数字成员。这种枚举类型的使用比较少见,但它提供了更多的编码灵活性。
enum Types {
No = "No",
Yes = 1
}
console.log(Types.No, Types.Yes); // 输出:No 1
接口与枚举
在 TypeScript 中,我们可以在接口中使用枚举类型来定义特定的属性类型,这样可以保证实现接口的对象在这些属性上具有正确的值。
enum Color {
no = "NO",
yes = 1
}
interface A {
red: Color.yes;
}
let B: A = {
red: Color.yes // 或者直接使用 red: 1
}
常量枚举
常量枚举是使用 const
关键字定义的枚举,其目的是为了防止在编译阶段生成额外的代码,并且禁止对枚举成员的非直接访问。
const enum Types {
success,
fail
}
let code: number = 0;
if (code === Types.success) {
console.log("我在人民广场吃炸鸡");
}
反向映射
数字枚举支持反向映射,即从枚举值到枚举名的映射。这不适用于字符串枚举成员,因为字符串枚举不生成反向映射。
enum Types {
success
}
let success: number = Types.success;
let key = Types[success];
console.log(`value---${success}`, `key----${key}`); // 输出:value---0, key----success