天天看點

TypeScript入門:枚舉類型

數字枚舉

enum Role {
    Reporter = 1,
    Developer,
    Maintainer,
    Owner,
    Guest
}console.log(Role.Reporter) // 1console.log(Role.Developer) // 2console.log(Role[2]) // 'Developer'複制代碼      

預設第一個成員的值為0,後面成員的值依次遞增,但是也可以給每個成員指派一個初始值,可以通過字元串去索引數字,也可以通過數字去索引字元串

TypeScript入門:枚舉類型

字元串枚舉

enum Message {
    Success = 'success',
    Fail = 'fail'}console.log(Message.Success) // 'success'console.log(Message['success']) // undefined複制代碼      

隻能通過Success去索引success,不能反過來用success去索引Success

異構枚舉

enum Answer {
    N,
    Y = 'Yes'}console.log(Answer.N) // 0console.log(Answer.Y) // 'Yes'複制代碼      

枚舉的成員中同時出現數字和字元串,不建議使用

枚舉成員

enum Char {// const member(常量枚舉成員)a,
    b = Char.a,
    c = 1 + 3,// computed member(計算枚舉成員)d = Math.random(),
    e = '123'.length,
    f = 4}複制代碼      

常量枚舉成員會在編譯階段計算出結果,然後以常量值的方式出現在運作環境,計算枚舉成員不會在編譯階段被計算,會被保留到運作階段,在運作階段才會計算出結果。注意:在計算成員後面的枚舉成員一定要指派一個初始值

// ts編譯結果"use strict";var Char;
(function (Char) {// const member(常量枚舉成員)Char[Char["a"] = 0] = "a";
    Char[Char["b"] = 0] = "b";
    Char[Char["c"] = 4] = "c";// computed member(計算枚舉成員)Char[Char["d"] = Math.random()] = "d";
    Char[Char["e"] = '123'.length] = "e";
    Char[Char["f"] = 4] = "f";
})(Char || (Char = {}));複制代碼      

常量枚舉

使用const定義的枚舉叫常量枚舉,特點是代碼會在編譯後被移除

const enum Month {
    Jan,
    Feb,
    Mar,
    Apr = Month.Mar + 1,
}
let month = [Month.Jan, Month.Feb, Month.Mar]複制代碼      
// 編譯後代碼"use strict";let month = [0 /* Jan */, 1 /* Feb */, 2 /* Mar */];複制代碼      

枚舉類型

  1. 枚舉成員沒有初始值
  2. 枚舉成員都是數字枚舉
  3. 枚舉成員都是字元串枚舉
// 枚舉成員沒有初始值
enum E { a, b }
// 枚舉成員都是數字枚舉
enum F { a = 0, b = 1 }
// 枚舉成員都是字元串枚舉
enum G { a = 'apple', b = 'banana' }

// 可以把任意的數字指派給E和F類型
let e: E = 3
let f: F = 3
e === f // 報錯,不同枚舉類型不能互相比較
 
// 變量定義為枚舉成員類型
let e1: E.a = 3
let e2: E.b = 3
let e3: E.a = 3
console.log(e1 === e2) // e1和e2是不同的枚舉成員類型,會報錯
console.log(e1 === e3) // true e1和e3是相同的枚舉成員類型,可以比較

// 字元串枚舉的取值隻能是枚舉成員的取值
let g1: G = G.a
let g2: G.a = G.a複制代碼      

繼續閱讀