上QQ阅读APP看书,第一时间看更新
5.4.7 const枚举类型
枚举类型是TypeScript对JavaScript的扩展,JavaScript语言本身并不支持枚举类型。在编译时,TypeScript编译器会将枚举类型编译为JavaScript对象。例如,我们定义如下的枚举:
01 enum Direction { 02 Up, 03 Down, 04 Left, 05 Right, 06 } 07 08 const d: Direction = Direction.Up;
此例中的代码编译后生成的JavaScript代码如下所示,为了支持枚举成员名与枚举成员值之间的正、反向映射关系,TypeScript还生成了一些额外的代码:
01 "use strict"; 02 var Direction; 03 (function (Direction) { 04 Direction[Direction["Up"] = 0] = "Up"; 05 Direction[Direction["Down"] = 1] = "Down"; 06 Direction[Direction["Left"] = 2] = "Left"; 07 Direction[Direction["Right"] = 3] = "Right"; 08 })(Direction || (Direction = {})); 09 10 const d = Direction.Up;
有时候我们不会使用枚举成员值到枚举成员名的反向映射,因此没有必要生成额外的反向映射代码,只需要生成如下代码就能够满足需求:
01 "use strict"; 02 var Direction; 03 (function (Direction) { 04 Direction["Up"] = 0; 05 Direction["Down"] = 1 06 Direction["Left"] = 2 07 Direction["Right"] = 3 08 })(Direction || (Direction = {})); 09 10 const d = Direction.Up;
更进一步讲,如果我们只关注第10行枚举类型的使用方式就会发现,完全不需要生成与Direction对象相关的代码,只需要将“Direction.Up”替换为它所表示的常量0即可。经过此番删减后的代码量将大幅减少,并且不会改变程序的运行结果,如下所示:
01 "use strict"; 02 const d = 0;
const枚举类型具有相似的效果。const枚举类型将在编译阶段被完全删除,并且在使用了const枚举类型的地方会直接将const枚举成员的值内联到代码中。
const枚举类型使用“const enum”关键字定义,示例如下:
01 const enum Directions { 02 Up, 03 Down, 04 Left, 05 Right, 06 } 07 08 const directions = [ 09 Directions.Up, 10 Directions.Down, 11 Directions.Left, 12 Directions.Right, 13 ];
此例中的代码经过TypeScript编译器编译后生成的JavaScript代码如下所示:
01 "use strict"; 02 const directions = [ 03 0 /* Up */, 04 1 /* Down */, 05 2 /* Left */, 06 3 /* Right */ 07 ];
我们能够注意到,为了便于代码调试和保持代码的可读性,TypeScript编译器在内联了const枚举成员的位置还额外添加了注释,注释的内容为枚举成员的名字。