TypeScript基礎入門 - 枚舉 - 運行時的枚舉和外部枚舉

轉發node

TypeScript基礎入門 - 枚舉 - 運行時的枚舉和外部枚舉

項目實踐倉庫git

https://github.com/durban89/typescript_demo.git
tag: 1.3.8

爲了保證後面的學習演示須要安裝下ts-node,這樣後面的每一個操做都能直接運行看到輸出的結果。github

npm install -D ts-node

後面本身在練習的時候能夠這樣使用typescript

npx ts-node 腳本路徑

枚舉

使用枚舉咱們能夠定義一些帶名字的常量。 使用枚舉能夠清晰地表達意圖或建立一組有區別的用例。 TypeScript支持數字的和基於字符串的枚舉。npm

運行時的枚舉

枚舉是在運行時真正存在的對象。 例以下面的枚舉:函數

enum E {
    X, Y, Z
}

實際上能夠傳遞給函數學習

enum E {
    X,Y,Z
}
function f(obj: { X: number }) {
    return obj.X
}

console.log(f(E));

反向映射

除了建立一個以屬性名作爲對象成員的對象以外,數字枚舉成員還具備了 反向映射,從枚舉值到枚舉名字。 例如,在下面的例子中:spa

enum Enum {
    A,
}

let a = Enum.A;
let nameOfA = Enum[a];
console.log(nameOfA);

TypeScript可能會將這段代碼編譯爲下面的JavaScript:code

var Enum;
(function (Enum) {
    Enum[Enum["A"] = 0] = "A";
})(Enum || (Enum = {}));
var a = Enum.A;
var nameOfA = Enum[a];
console.log(nameOfA);

生成的代碼中,枚舉類型被編譯成一個對象,它包含了正向映射( name -> value)和反向映射( value -> name)。 引用枚舉成員總會生成爲對屬性訪問而且永遠也不會內聯代碼。對象

要注意的是 不會爲字符串枚舉成員生成反向映射。

const枚舉

大多數狀況下,枚舉是十分有效的方案。 然而在某些狀況下需求很嚴格。 爲了不在額外生成的代碼上的開銷和額外的非直接的對枚舉成員的訪問,咱們可使用 const枚舉。 常量枚舉經過在枚舉上使用 const修飾符來定義。

const enum Enum {
    A = 1,
    B = A * 2,
}

常量枚舉只能使用常量枚舉表達式,而且不一樣於常規的枚舉,它們在編譯階段會被刪除。 常量枚舉成員在使用的地方會被內聯進來。 之因此能夠這麼作是由於,常量枚舉不容許包含計算成員。

const enum Directions {
    Up,
    Down,
    Left,
    Right,
}

let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];


生成後的代碼爲:

var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];

外部枚舉

外部枚舉用來描述已經存在的枚舉類型的形狀。

declare enum Enum {
    A = 1,
    B,
    C = 2
}


外部枚舉和非外部枚舉之間有一個重要的區別,在正常的枚舉裏,沒有初始化方法的成員被當成常數成員。 對於很是數的外部枚舉而言,沒有初始化方法時被當作須要通過計算的。
本實例結束實踐項目地址

https://github.com/durban89/typescript_demo.git
tag: 1.3.9
相關文章
相關標籤/搜索