Typescript學習筆記(二)列舉
阿新 • • 發佈:2019-01-10
跟隨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);