枚举
枚举(Enum)类型用于取值被限定在一定范围内的场景,比如一周七天,颜色限定为红绿蓝等等
简单的例子
枚举 使用关键字 enum 来定义
enum Days {
Sun,
Mon,
Tue,
Wed,
Thu,
Fri,
Sat
}
枚举成员会被赋值从 0 开始递增的数字,同时也会对枚举值到枚举名进行反向映射
enum Days {
Sun,
Mon,
Tue,
Wed,
Thu,
Fri,
Sat
}
console.log(Days["Sun"] === 0); // true
console.log(Days["Mon"] === 1); // true
console.log(Days["Tue"] === 2); // true
console.log(Days["Sat"] === 6); // true
console.log(Days[0] === "Sun"); // true
console.log(Days[1] === "Mon"); // true
console.log(Days[2] === "Tue"); // true
console.log(Days[6] === "Sat"); // true
手动赋值
- 我们也可以给枚举项手动赋值
enum Days {Sun = 7, Mon = 1, Tue, Wed, Thu, Fri, Sat};
console.log(Days["Sun"] === 7); // true
console.log(Days["Mon"] === 1); // true
console.log(Days["Tue"] === 2); // true
console.log(Days["Sat"] === 6); // true
上面的例子中,未手动赋值的枚举项会接着上一个枚举项递增
但是如果未手动赋值的枚举项与手动赋值的重复了,Typescript 是不会察觉到这一点的
enum Days {Sun = 3, Mon = 1, Tue, Wed, Thu, Fri, Sat};
console.log(Days["Sun"] === 3); // true
console.log(Days["Wed"] === 3); // true
console.log(Days[3] === "Sun"); // false
console.log(Days[3] === "Wed"); // true
这样的结果最开始的 Sun 就会被覆盖掉
- 手动赋值也可以是别的类型,比如字符串
enum Days {Sun = 7, Mon, Tue, Wed, Thu, Fri, Sat = <any>"S"};
- 当然手动赋值的枚举项也可以为小数或者负数,此时后续未手动赋值的项递增步长仍为 1
enum Days {Sun = 7, Mon = 1.5, Tue, Wed, Thu, Fri, Sat};
console.log(Days["Sun"] === 7); // true
console.log(Days["Mon"] === 1.5); // true
console.log(Days["Tue"] === 2.5); // true
console.log(Days["Sat"] === 6.5); // true
常数项和计算所得项
枚举项 有两种类型: 常熟项和计算所得项
一个典型计算所得项的例子
enum Color {Red, Green, Blue = "blue".length};
上面的例子不会报错,但如果紧接在计算项后面的是未手动赋值的项目,那么它就无法获取初始值而报错
enum Color {Red = "red".length, Green, Blue};
// index.ts(1,33): error TS1061: Enum member must have initializer.
// index.ts(1,40): error TS1061: Enum member must have initializer.