枚举类型是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枚举成员的位置还额外添加了注释,注释的内容为枚举成员的名字。
酷客网相关文章:
评论前必须登录!
注册