TypeScript 里的枚举类型 enum
官網(wǎng)地址
枚舉是 TypeScript 為數(shù)不多的不是 JavaScript 類型級(jí)擴(kuò)展的特性之一。
枚舉允許開(kāi)發(fā)人員定義一組命名常量。 使用枚舉可以更輕松地記錄意圖,或創(chuàng)建一組不同的案例。 TypeScript 提供數(shù)字和基于字符串的枚舉。
Numeric enums
我們將首先從數(shù)字枚舉開(kāi)始,如果您在其他語(yǔ)言里使用過(guò)枚舉類型,可能會(huì)更熟悉。 可以使用 enum 關(guān)鍵字定義枚舉。
enum Direction {Up = 1,Down,Left,Right, }上面的代碼里,我們有一個(gè)數(shù)字枚舉,其中 Up 初始化為 1。從那時(shí)起,以下所有成員都會(huì)自動(dòng)遞增。 換句話說(shuō),Direction.Up 的值為 1,Down 的值為 2,Left 的值為 3,Right 的值為 4。
如果省去 Up = 1,則默認(rèn)從 0 開(kāi)始給枚舉值賦值。
運(yùn)行時(shí)的枚舉值
枚舉是在運(yùn)行時(shí)存在的真實(shí)對(duì)象。 例如,下面的枚舉,可以作為形式參數(shù)的定義,傳入到函數(shù)里:
enum E {X,Y,Z, }function f(obj: { X: number }) {return obj.X; }// Works, since 'E' has a property named 'X' which is a number. f(E);上面的例子里,E.X 和 { X: number } 這兩個(gè)類型是兼容的 - Compatible
Reverse mappings
使用反向映射,能夠根據(jù)枚舉的值拿到其名稱。
除了為成員創(chuàng)建具有屬性名稱的對(duì)象之外,數(shù)字枚舉成員還獲得從枚舉值到枚舉名稱的反向映射。 例如,在這個(gè)例子中:
enum Enum {A, }let a = Enum.A; let nameOfA = Enum[a]; // "A"對(duì)應(yīng)生成的 JavaScript 代碼:
"use strict"; var Enum; (function (Enum) {Enum[Enum["A"] = 0] = "A"; })(Enum || (Enum = {})); let a = Enum.A; let nameOfA = Enum[a]; // "A"在這個(gè)生成的代碼中,一個(gè)枚舉被編譯成一個(gè)存儲(chǔ)前向(名稱 -> 值)和反向(值 -> 名稱)映射的對(duì)象。 對(duì)其他枚舉成員的引用始終作為屬性訪問(wèn)發(fā)出,并且從不內(nèi)聯(lián)。
請(qǐng)記住,字符串枚舉成員根本不會(huì)生成反向映射。
constenums
在大多數(shù)情況下,枚舉是一個(gè)完全有效的解決方案。 然而,有時(shí)要求更嚴(yán)格。 為了避免在訪問(wèn)枚舉值時(shí)支付額外生成的代碼和額外的間接費(fèi)用,可以使用 const 枚舉。 Const 枚舉是在我們的枚舉上使用 const 修飾符定義的:
const enum Enum {A = 1,B = A * 2, }常量枚舉只能使用常量枚舉表達(dá)式,并且與常規(guī)枚舉不同,它們?cè)诰幾g期間被完全刪除。 Const 枚舉成員在使用站點(diǎn)內(nèi)聯(lián)。 這是可能的,因?yàn)?const 枚舉不能有計(jì)算成員。
const enum Direction {Up,Down,Left,Right, }let directions = [Direction.Up,Direction.Down,Direction.Left,Direction.Right, ];上述代碼轉(zhuǎn)換成 JavaScript 之后:
"use strict"; let directions = [0 /* Up */,1 /* Down */,2 /* Left */,3 /* Right */, ];另一個(gè)實(shí)際例子:
enum FakeUserAgent {Chrome = 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',InternetExplorer10 = 'Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)',InternetExplorer11 = 'WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; rv:11.0) like Gecko',Firefox = 'Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0', };const nonInternetExplorerUserAgents: ReadonlyArray<string> =Object.entries(FakeUserAgent).filter(([browser]) =>!browser.toLowerCase().includes('internetexplorer')).map(([_browser, userAgent]) => userAgent);console.log(nonInternetExplorerUserAgents);執(zhí)行效果:
枚舉字段里包含字符串 internetexplorer 的值被過(guò)濾了:
總結(jié)
以上是生活随笔為你收集整理的TypeScript 里的枚举类型 enum的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 智能手机销售持续疲软,高通 Q2 净利润
- 下一篇: TypeScript Mixins 概念