1. 程式人生 > >Typescript學習筆記(二)列舉

Typescript學習筆記(二)列舉

跟隨handbook的腳步,詳細介紹一下列舉。

enum Direction {
    Up = 1,
    Down,
    Left,
    Right
}

一個列舉型別可以包含零個或多個列舉成員,每個列舉成員可以是一個常數,也可以是計算變數。

如果沒有初始化就會被當作常數,這是第一項為0,其餘為前一項加一。

如果項具有ts表示式,在編譯的時候就會被計算出來。比如

複製程式碼

enum FileAccess {
    // constant members
    None,
    Read    = 1 << 1,
    Write   = 1 << 2,
    ReadWrite  = Read | Write
    // computed member
    G = "123".length
}

複製程式碼

 

當然,反向對映是木有問題的。

enum Enum {
    A
}
let a = Enum.A;
let nameOfA = Enum[Enum.A]; // "A"

 

它被編譯成:

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

常數列舉

常數列舉是在enum關鍵字前使用const修飾符

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

 

你編譯出來會看到js什麼也沒有,是的,它是在編譯階段會被刪除,而且它和名字一樣只能使用常數表示式。(常數列舉成員在使用的地方被內聯進來。 這是因為常數列舉不可能有計算成員)。

const enum Enum {
    A = 1*8,
    B = A * 2
}
var re=Enum.A;
console.log( re);

 

你會看到編譯出來是

var re = 8 /* A */;
console.log(re);

 

外部列舉

外部列舉就像這樣,用declare關鍵字定義

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

 

引用中文book的話說:外部列舉和非外部列舉之間有一個重要的區別,在正常的列舉裡,沒有初始化方法的成員被當成常數成員。 對於非常數的外部列舉而言,沒有初始化方法時被當做需要經過計算的。

複製程式碼

declare enum Enum {
    A = 1,
    B,
    C = 2
}
var re=Enum.A;
 console.log( re); 

複製程式碼

 

如上的外部列舉,編譯出來為

var re = Enum.A;
console.log(re);