TypeScript const枚举类型

枚举类型是TypeScript对JavaScript的扩展,JavaScript语言本身并不支持枚举类型。在编译时,TypeScript编译器会将枚举类型编译为JavaScript对象。例如,我们定义如下的枚举:

enum Direction {
   Up,
   Down,
   Left,
   Right,
}

const d: Direction = Direction.Up;

此例中的代码编译后生成的JavaScript代码如下所示,为了支持枚举成员名与枚举成员值之间的正、反向映射关系,TypeScript还生成了一些额外的代码:

"use strict";
var Direction;
(function (Direction) {
   Direction[Direction["Up"] = 0] = "Up";
   Direction[Direction["Down"] = 1] = "Down";
   Direction[Direction["Left"] = 2] = "Left";
   Direction[Direction["Right"] = 3] = "Right";
})(Direction || (Direction = {}));

const d = Direction.Up;

有时候我们不会使用枚举成员值到枚举成员名的反向映射,因此没有必要生成额外的反向映射代码,只需要生成如下代码就能够满足需求:

"use strict";
var Direction;
(function (Direction) {
   Direction["Up"] = 0;
   Direction["Down"] = 1
   Direction["Left"] = 2
   Direction["Right"] = 3
})(Direction || (Direction = {}));

const d = Direction.Up;

更进一步讲,如果我们只关注第10行枚举类型的使用方式就会发现,完全不需要生成与Direction对象相关的代码,只需要将“Direction.Up”替换为它所表示的常量0即可。经过此番删减后的代码量将大幅减少,并且不会改变程序的运行结果,如下所示:

"use strict";
const d = 0;

const枚举类型具有相似的效果。const枚举类型将在编译阶段被完全删除,并且在使用了const枚举类型的地方会直接将const枚举成员的值内联到代码中。

const枚举类型使用“const enum”关键字定义,示例如下:

const enum Directions {
   Up,
   Down,
   Left,
   Right,
}

const directions = [
   Directions.Up,
   Directions.Down,
   Directions.Left,
   Directions.Right,
];

此例中的代码经过TypeScript编译器编译后生成的JavaScript代码如下所示:

"use strict";
const directions = [
   0 /* Up */,
   1 /* Down */,
   2 /* Left */,
   3 /* Right */
];

我们能够注意到,为了便于代码调试和保持代码的可读性,TypeScript编译器在内联了const枚举成员的位置还额外添加了注释,注释的内容为枚举成员的名字。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!