枚举
- 概述:枚举(Enum)类型用于取值被限定在一定范围内的场景,比如一周只能有七天。
enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
1.给枚举项手动赋值:
enum Days {Sun = 7, Mon = 1, Tue, Wed, Thu, Fri, Sat};
console.log(Days["Sun"] === 7);
console.log(Days["Mon"] === 1);
// 当然,手动赋值的枚举项也可以为小数或负数,此时后续未手动赋值的项的递增步长仍为 1
enum Days {Sun = 7, Mon = 1.5, Tue, Wed, Thu, Fri, Sat};
console.log(Days["Sun"] === 7);
console.log(Days["Mon"] === 1.5);
2.常数项和计算所得项
- 概述:枚举项有两种类型:常数项和计算所得项
(1)一个典型的计算所得项的例子(如果紧接在计算所得项后面的是未手动赋值的项,那么它就会因为无法获得初始值而报错)
enum Color {Red, Green, Blue = "blue".length}; // 正确
enum Color {Red = "red".length, Green, Blue}; // 错误
3.常数枚举
- 概述:常数枚举是使用 const enum 定义的枚举类型
(1)常数枚举与普通枚举的区别是,它会在编译阶段被删除,并且不能包含计算成员
const enum Directions { Up, Down, Left, Right }
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];
//编译成js后
var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];
(2)假如包含了计算成员,则会在编译阶段报错
const enum Color {Red, Green, Blue = "blue".length}; // error: In 'const' enum declarations member initializer must be constant expression
4.外部枚举
- 概述:外部枚举是使用 declare enum 定义的枚举类型
(1)declare 定义的类型只会用于编译时的检查,编译结果中会被删除
declare enum Directions { Up, Down, Left, Right }
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];
//编译成js后
var directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];
(2)外部枚举和常数枚举同时使用
declare const enum Directions { Up, Down, Left, Right }
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];
//编译成js后
var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];