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