enum
类型是对JavaScript标准数据类型的一个补充。
enum Role { Reporter, // Reporter = 1, 默认状况下,从0开始为元素编号。 也可赋值,后续值递增 Developer, Maintainer, Owner, Guest }
编译准成为以下:app
var Role; (function (Role) { Role[Role["Reporter"] = 0] = "Reporter"; Role[Role["Developer"] = 1] = "Developer"; Role[Role["Maintainer"] = 2] = "Maintainer"; Role[Role["Owner"] = 3] = "Owner"; Role[Role["Guest"] = 4] = "Guest"; })(Role || (Role = {}));
enum Message { Success = '成功!', Fail = '失败!' }
编译准成为以下:dom
var Message; (function (Message) { Message["Success"] = "\u6210\u529F\uFF01"; Message["Fail"] = "\u5931\u8D25\uFF01"; })(Message || (Message = {}));
能够混合字符串和数字成员spa
enum Answer { N, Y = 'Yes' } // 编译结果以下: var Answer; (function (Answer) { Answer[Answer["N"] = 0] = "N"; Answer["Y"] = "Yes"; })(Answer || (Answer = {}));
enum Char { // const member 为未初始化/对已有枚举成员的引用/常量表达式 (在编译时计算出结果,而后以常量的形式出如今运行环境 a, b = Char.a, c = 1 + 3, // compute member 不会在编译阶段进行计算,而会保留到程序的执行阶段 d = Math.random(), e = '123'.length, } 编译后==》 var Char; (function (Char) { // const member 为未初始化/对已有枚举成员的引用/常量表达式 (在编译时计算出结果,而后以常量的形式出如今运行环境 Char[Char["a"] = 0] = "a"; Char[Char["b"] = 0] = "b"; Char[Char["c"] = 4] = "c"; // compute member 不会在编译阶段进行计算,而会保留到程序的执行阶段 Char[Char["d"] = Math.random()] = "d"; Char[Char["e"] = '123'.length] = "e"; })(Char || (Char = {})); Char.a = 2 // Cannot assign to 'a' because it is a read-only property (只读状态)
用const定义的枚举为常量枚举,会在编译阶段被移除code
场景:当不须要一个对象,而只须要对象的值时,可以使用常量枚举。会减小在编译环境上的代码对象
const enum Month { Jan, Feb, Mar } let month = [Month.Jan, Month.Feb, Month.Mar] 编译后==》 var month = [0 /* Jan */, 1 /* Feb */, 2 /* Mar */];
在某种状况下,枚举和枚举成员均可以做为一种单独的类型存在(枚举成员没有初始值 / 全部成员都为数字枚举 / 全部成员均为字符串枚举)blog
enum E { a, b } enum F { a = 0, b = 1 } enum G { a = 'apple', b = 'banana'} let e: E = 3 let f: F = 3 e === f This condition will always return 'false' since the types 'E' and 'F' have no overlap// 两种不一样种类的枚举是没法比较的 let e1: E.a = 1 let e2: E.b = 2 // e1 === e2 同上 let e3: E.a = 3 e1 === e3 // 相同枚举成员类型,便可比较 let g1: G = G.a | G.b // 字符串枚举 取值只能是 枚举成员的类型 let g2: G.a = G.a // 只能为G.a