TS:枚举的拓展
1. 枚举的计算
-
枚举成员可以使用常量枚举表达式进行初始化:
enum E { None , OK = 1 << 1, Read = 1 << 2, Write = 2 << 1, ReadWrite = Read | Write, Pending = "123".length }
2.枚举成员的类型
-
枚举成员被枚举后,就带有了一种特殊的语义;
-
枚举成员成为了类型:
enum E { A , B } interface A { type : E.A; value : number } let c : A { type : E.B, //error , A接口的type属性的类型为E.A value : 1 }
-
枚举是在运行时真正存在的对象:
enum E { X , Y} function foo(obj : { X : number}){ return obj,X; } foo(E); //ok,E是一个真实存在的对象,X他的一个属性,值为0。
4. 枚举的反向映射
-
枚举除了可以从枚举名字获得枚举值外,还可以从枚举值获取到枚举名字。
enum E { X , Y} console.log(E[0]) // "X"
5. 常量枚举
-
为了避免在额外生成的代码上的开销 和 额外的非直接对枚举成员的访问,可以使用
const
进行枚举。const enum E{ A = 1, B = 2 * A }
-
常量枚举只能使用常量枚举表达式;
-
常量枚举会在编译阶段被删除,取而代之的是枚举的值;
-
外部枚举:外部枚举用来描述已经存在的枚举类型的形状。
- 外部枚举和非外部枚举之间有一个重要的区别:在正常的枚举里,没有初始化方法的成员被当成常数成员。
- 对于非常数的外部枚举而言,没有初始化方法时被当做需要经过计算的。
declare enum E{ A = 1, B , C = 3 }