TypeScript枚举

枚举

枚举(Enum)类型用于取值被限定在必定范围内的场景,好比一周只能有七天,颜色限定为红绿蓝等函数

示例

使用枚举来定义关键字code

enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat};

枚举成员会被赋值成从0开始,同行枚举名和值也会进行反向映射:对象

enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
console.log(Days[0] === 'Sun'); //true
console.log(Days['Sat'] === 6);//true

手动赋值

enum Days {Sun=7, Mon, Tue, Wed=1, Thu, Fri, Sat};

未被赋值的枚举项会接着上一个枚举项递增 如:ip

上面的枚举值会被编译成如下结果
{1: "Wed", 2: "Thu", 3: "Fri", 4: "Sat", 7: "Sun", 8: "Mon", 9: "Tue", Sun: 7, Mon: 8, 
Tue: 9, Wed: 1, Thu: 2, Fri: 3, Sat: 4, Sun: 7, Mon: 8, Tue: 9 }

若是未被赋值的和手动赋值的重复了,TypeScript不会报错,后者会覆盖前者it

因此使用的时候须要注意,最好不要出现这种覆盖的状况io

手动赋值的枚举项能够不是数字,可是必需要使用类型断言来人tsc无视类型检查:console

enum Days {Sun=7, Mon, Tue, Wed, Thu, Fri=({ value: 123, text: 'Fri'} as any), Sat=('Sat' as any)};

若是手动赋值的是非数字的话,手动赋值的枚举项后面也必须都要赋值,不然会报错:编译

enum Days {Sun=7, Mon, Tue, Wed, Thu, Fri=({ value: 123, text: 'Fri'} as any), Sat};
//Enum member must have initializer.

手动赋值也能够是小数或者负数,后续为赋值的项还是递增长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

常数项和计算所得项

枚举项有两种类型:常数项(constant member)和计算所得项(computed member)。方法

enum Color {Red, Green, Blue = 'blue'.length};

'blue'.length就是计算所得项;

若是紧接着计算所得项后面是未手动赋值的项,那么他就会由于没法得到初始值而报错:

enum Color {Red = 'red'.length, Green, Blue};
//Enum member must have initializer.

知足一下条件的枚举成员被当作是常数:

  • 没有初始化函数而且以前的枚举成员是常数;这种状况下当前枚举成员的值是上一个成员+1;第一个枚举成员若是没有初始化,那么他的初始值为0
  • 枚举成员使用常数枚举表达式初始化;常数枚举表达式是 TypeScript 表达式的子集,它能够在编译阶段求值。当一个表达式知足下面条件之一时,它就是一个常数枚举表达式:

    • 数字字面量(即数字本身,不须要其余符号)
    • 引用以前定义的常数枚举成员(能够是在不一样的枚举类型中定义的)若是这个成员是在同一个枚举类型中定义的,可使用非限定名来引用
    • 带括号的常数枚举表达式
    • +, -, ~ 一元运算符应用于常数枚举表达式
    • +, -, *, /, %, <<, >>, >>>, &, |, ^ 二元运算符,常数枚举表达式作为其一个操做对象。若常数枚举表达式求值后为 NaN 或 Infinity,则会在编译阶段报错

常数枚举

常数枚举是使用 const enum 定义的枚举类型:

const enum Directions { up, down, left, right };
let directions = [Directions.up,Directions.down,Directions.left,Directions.right];
//[0, 1, 2, 3]

与普通枚举的区别是在编译阶段会被删除,而且不能包含计算成员。

const enum Color {Red, Green, Blue = 'blue'.length};
//const enum member initializers can only contain literal values and other computed enum values.

外部枚举

外部枚举用来描述已经存在的枚举类型的形状。

declare enum Directions { up, down, left, right };
let directions = [Directions.up,Directions.down,Directions.left,Directions.right];

declare 定义的类型只会用于编译时的检查,编译结果中会被删除。

外部枚举和非外部枚举之间有一个重要的区别,在正常的枚举里,没有初始化方法的成员被当成常数成员。 对于很是数的外部枚举而言,没有初始化方法时被当作须要通过计算的。

外部枚举与声明语句同样,常出如今声明文件中。

同时使用 declareconst 也是能够的:

declare const enum Directions { up, down, left, right };
let directions = [Directions.up,Directions.down,Directions.left,Directions.right];
//[0, 1, 2, 3]
相关文章
相关标签/搜索