TypeScript真香系列-枚舉

前言

TypeScript真香系列的內容將參考中文文檔,可是文中的例子基本不會和文檔中的例子重複,對於一些地方也會深刻研究。另外,文中一些例子的結果都是在代碼沒有錯誤後編譯爲JavaScript獲得的。若是想實際看看TypeScript編譯爲JavaScript的代碼,能夠訪問TypeScript的在線編譯地址,動手操做,印象更加深入。javascript

概念

枚舉是對JavaScript標準數據類型集的擴充,常被用來限定在必定範圍內取值的場景。在TypeScript中支持數字和字符串的枚舉。咱們能夠用enum來實現。java

數字枚舉

先看看一個數字枚舉例子:git

enum Basketballer{ 
    Yao,
    Yi,
    Wang
}
Basketballer.Yao; //0
Basketballer.Yi;  //1
Basketballer.Wang;  //2
複製代碼

咱們也能夠這樣,下面這個方法被稱爲反向映射,即經過值來訪問鍵:github

Basketballer[0]; //"Yao"
Basketballer[1]; //"Yi"
Basketballer[2]; //"Wang"
Basketballer[3]; //undefined
複製代碼

上面的例子,咱們沒有對Yao或者其它成員進行初始化,若是咱們進行初始化:typescript

enum Basketballer{ 
    Yao = 1,
    Yi,
    Wang
}
Basketballer.Yao; //1
Basketballer.Yi;  //2
Basketballer.Wang;  //3
Basketballer[1];  //"Yao"
Basketballer[2];  //"Yi"
Basketballer[3];  //"Wang"
複製代碼

從上面能夠看出,若是一個成員設了一個值,那麼後面相應的值都會遞增。可是要注意的是,若是沒有什麼特殊的目的的話,仍是不要對多個成員進行手動賦值。由於有時候可能會致使一些問題:ui

enum Basketballer{ 
    Yao = 1,
    Yi,
    Wang = 2,
    Zhu,
    Zhou,
}
Basketballer[2]; //"Wang"
Basketballer.Yi; //2
複製代碼

一個枚舉的簡單應用:spa

enum Basketballer{ 
    Yao = 1,
    Yi,
    Wang,
    Zhu,
    Zhou,
}

function one(arg: Basketballer): string{
    let num = arg;
    switch (num) {
        case 1:
            return Basketballer[num] + "第一人";
        case 2:
            return Basketballer[num] + "第二人";
        case 3:
            return Basketballer[num] + "第二人";
        default:
            return "籃球";
    }
}
one(1); //"Yao第一人"
one(6); // "籃球人"
one("1"); //錯誤,「1」類型的參數不能分配給Basketballer
複製代碼

在數字枚舉中,咱們在定義枚舉成員值的時候,能夠是常量,也能夠是計算出來的:code

枚舉成員值爲常量

一、枚舉的第一個成員且沒有初始化:對象

enum Basketballer{ 
    Yao
}
Basketballer.Yao; //0
複製代碼

二、不帶初始化器而且它以前的成員是一個數字常量:ip

enum Basketballer1{ 
    Yao,  //0
    Yi,   //1
    Wang  //2 
}

enum Basketballer2{ 
    Yao = 1,  //1
    Yi,       //2
    Wang     //3 
}
複製代碼

三、枚舉成員使用常量枚舉表達式初始化。當下麪條件知足其中之一,就是一個常量枚舉表達式: 一個枚舉表達式字面量(主要是字符串字面量或數字字面量)

enum Man{ a = 1}
複製代碼

一個對以前定義的常量枚舉成員的引用(能夠是在不一樣的枚舉類型中定義的)

enum Man{ a = 1, b = 2*a}
複製代碼

帶括號的常量枚舉表達式

enum Man{ a = 1, b = 2*(a +1)}
複製代碼

一元運算符 +, -, ~其中之一應用在了常量枚舉表達式

enum Man{ a = 1, b= ~a}
複製代碼

常量枚舉表達式作爲二元運算符 +, -, *, /, %, <<, >>, >>>, &, |, ^的操做對象。 若常數枚舉表達式求值後爲 NaN或 Infinity,則會在編譯階段報錯。

enum Man{ a = 1 << 2}
複製代碼

枚舉成員值爲計算值

除開上面所舉的全部枚舉成員都被看成是須要計算出來的值:

enum Man{ a = "abc".length }
複製代碼

字符串枚舉

字符串枚舉中沒有自增的特性,咱們在初始化的時候必須給每個成員都設字符串。

enum Basketballer{ 
    Yao = "籃協主席",
    Yi = "牌面",
    Wang = "老大哥",
}
Basketballer.Yao; //"籃協主席"
複製代碼

可是字符串枚舉沒有反向映射:

Basketballer["籃協主席"]; // 錯誤
複製代碼

異構枚舉

異構枚舉至關於數字枚舉和字符串枚舉的結合體,可是官方文檔不建議這樣寫。

enum Basketballer{ 
    Yao = "籃協主席",
    Yi = 1,
}
複製代碼

const 枚舉

咱們能夠經過const修飾符來強調當前枚舉類型,const枚舉只能使用使用常量枚舉表達式,並且會在編譯階段被刪除。咱們能夠用const enum來定義:

const enum Man {
    A,
    B,
    C,
    D
}
let man = [Man.A, Man.B, Man.C, Man.D];
console.log(man); // [0, 1, 2, 3]
複製代碼

讓咱們看看編譯結果:

let man = [0 /* A */, 1 /* B */, 2 /* C */, 3 /* D */];
console.log(man); // [0, 1, 2, 3]
複製代碼

外部枚舉

外部枚舉用來描述已經存在的枚舉類型的形狀,能夠用declare enum來定義:

declare enum Man {
    A,
    B,
    C,
    D
}
let man = [Man.A, Man.B, Man.C, Man.D];
複製代碼

讓咱們看看編譯結果:

let man = [Man.A, Man.B, Man.C, Man.D];
複製代碼

參考

github.com/zhongsp/Typ… github.com/jkchao/type…

最後

文中有些地方可能會加入一些本身的理解,如有不許確或錯誤的地方,歡迎指出~

相關文章
相關標籤/搜索