TypeScript入门与实战
上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枚举成员的位置还额外添加了注释,注释的内容为枚举成员的名字。