一、TypeScript-枚举类型
1. 什么是枚举
- 枚举(Enum)类型用于取值被限定在一定范围内的场景,TypeScript支持数字的和基于字符串的枚举。
- 关键字:enum
2. 怎么去定义枚举
-
数字枚举定义
enmu Status { ON, OFF } // 访问取值 console.log(Status.ON); // 0 // 访问取枚举 console.log(Status[0]); // ON
-
默认数值从0开始排序,当然和可以自定义,如果ON表示1,其余的成员会从1开始自定增长。
-
注意:手动赋值时,注意值覆盖的情况,这种ts是无法检测报错的。
enum Months { JAN = 4, FEB = 1, MAR, APR, MAY, JUN, JUL, }
-
手动赋值也可以是小数,比如FEB=1.5,但是递增的步长依旧会是1
-
如果手动赋值的枚举项不是数字,此时需要使用类型断言来让tsc无视类型检查。
JUL = <any>"jul",
-
-
字符串枚举
-
为每一个枚举都赋值字符串,在一个字符串枚举中,每一个成员都必须用字符串字面量或者另外一个字符串枚举成员进行初始化。
-
由于字符串枚举没有自增长的行为,字符串枚举可以很好的序列化。
-
编译结果显示只有成员名称作为key,所以它不能进行反向映射。
enum Direction { UP = "UP", DOWN = "DOWN", LEFT = "LEFT", RIGHT = "RIGHT", } // 访问 console.log(Direction.UP); // UP
-
-
异构枚举
枚举可以混用字符串和数字成员,容易混淆,不建议使用。
-
3. 枚举成员
-
常数成员【constant member】
-
三种情况:
-
没有初始值的情况下
-
对已有枚举成员引用
-
常量的表达式,常量枚举成员会在编译的时候计算结果,然后以常量的形式出现在运行时环境。
-
一个枚举表达式字面量(主要是字符串字面量或数字字面量)
-
一个对之前定义的常量枚举成员的引用(可以是在不同的枚举类型中定义的)
-
带括号的常量枚举表达式
-
一元运算符
+
,-
,~
其中之一应用在了常量枚举表达式 -
常量枚举表达式做为二元运算符
+
,-
,*
,/
,%
,<<
,>>
,>>>
,&
,|
,^
的操作对象。 若常数枚举表达式求值后为NaN
或Infinity
,则会在编译阶段报错。
-
-
前面举例都是常数项枚举
-
-
-
计算成员【computed member】
-
计算出来的值,这些枚举成员的值不会在编译阶段计算,而是在程序执行阶段计算。
enum CharTest { a = Math.random(), b = '123'.length, c // 提示错误 }
- 注意:如果紧接在计算所得项后面的是未手动赋值的项,那么它就会因为无法获得初始值而报错,除非将其提前。
-
4. 枚举类型
-
常量枚举
-
特性:会在编译阶段被移除
-
作用:当我们不需要一个对象,而需要这个对象的值时,就需要使用常量枚举,这样可以减少在编译环境下的代码。
-
定义:常数项枚举使用const enum定义枚举类型:
const enum Directions { UP, DOWN, LEFT, RIGHT, } let directions = [Directions.UP, Directions.DOWN, Directions.LEFT, Directions.RIGHT];
编译:
var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];
-
注意:常数项枚举不可以包含计算成员
-
注意:两种不同类型的枚举不能进行比较。
-
-
外部枚举
-
外部枚举(Ambient Enums)是使用
declare enum
定义的枚举类型:declare enum Directions { Up, Down, Left, Right } let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];
编译:
var directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]
- 外部枚举和非外部枚举之间有一个重要的区别,在正常的枚举里,没有初始化方法的成员被当成常数成员。 对于非常数的外部枚举而言,没有初始化方法时被当做需要经过计算的。
-