1.数字类型枚举
enum Color {
Red,
Green,
Blue
}
let col = Color.Red;
col = 0; // 有效的,这也是 Color.Red
在被编译成js后
var Color;
(function (Color) {
Color[Color["Red"] = 0] = "Red";
Color[Color["Green"] = 1] = "Green";
Color[Color["Blue"] = 2] = "Blue";
})(Color || (Color = {}));
js将Color[“Red”]赋值为0,再将Color[Color[“Red”] = 0],即 Color[0] = “Red”;
所以下面的代码也是可行的
console.log(Color[0]); // 输出‘Red’
console.log(Color['Red']) //输出 0
默认情况下,第一个枚举为0,也可以定义第一个枚举的值
enum Color {
DarkRed = 3, // 3
DarkGreen, // 4
DarkBlue // 5
}
字符串类型枚举
export enum EvidenceTypeEnum {
UNKNOWN = '',
PASSPORT_VISA = 'passport_visa',
PASSPORT = 'passport',
SIGHTED_STUDENT_CARD = 'sighted_tertiary_edu_id',
SIGHTED_KEYPASS_CARD = 'sighted_keypass_card',
SIGHTED_PROOF_OF_AGE_CARD = 'sighted_proof_of_age_card'
}
常量枚举
const enum Tristate {
False,
True,
Unknown
}
看似没有变化,增加了const 关键字,但如果这里设置一个值
const lie = Tristate.False;
不加const的定义方式下,编译成js为
let lie = Tristate.False
使用常量枚举下会编译成
let lie = 0;
编译器将会:
内联枚举的任何用法(0 而不是 Tristate.False);
不会为枚举类型编译成任何 JavaScript(在这个例子中,运行时没有 Tristate 变量),因为它使用内联语法。
常量枚举 preserveConstEnums 选项
使用内联语法对性能有明显的提升作用。运行时没有 Tristate 变量的事实,是因为编译器帮助你把一些在运行时没有用到的不编译成 JavaScript。然而,你可能想让编译器仍然把枚举类型编译成 JavaScript,用于如上例子中从字符串到数字,或者是从数字到字符串的查找。在这种情景下,你可以使用编译选项 --preserveConstEnums,它会编译出 var Tristate 的定义,因此你在运行时,手动使用 Tristate[‘False’] 和 Tristate[0]。并且这不会以任何方式影响内联。
参考资料:深入理解TypeScript