1. 程式人生 > 其它 >【TypeScript】初步瞭解列舉

【TypeScript】初步瞭解列舉

技術標籤:Typescripttypescript列舉

TypeScript 初步瞭解列舉

理解:列舉是列舉固定幾個值,直接定義變數的話的話可以隨意定義,列舉只能使用你定義好的幾個值。使用列舉我們可以定義一些帶名字的常量,TypeScript支援數字的和基於字串的列舉

使用了列舉,別人只能傳你列舉類裡定義好的幾個型別,傳其它的就會在編譯時期報錯

數字列舉

我們定義了一個數字列舉, Up使用初始化為 1。 其餘的成員會從 1開始自動增長(自增長1)。 換句話說,Direction.Up的值為 1, Down為 2, Left為 3, Right為 4

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

不使用初始化器,則 Up的值為 0, Down的值為 1…自增長的行為是很有用處的,但是要注意每個列舉成員的值都是不同的

enum Direction { Up, Down, Left, Right }

通過列舉的屬性來訪問列舉成員,和列舉的名字來訪問列舉型別:

enum response {
  No = 0,
  Yes = 1
}

function a(b: string, message: response): void {
  // ...
}

a("test", response.Yes)

下面的情況不被允許的:

enum E {
  A = getSomeValue(),
  B // error! 'A' is not constant-initialized, so 'B' needs an initializer
}

原因: 由於getSomeValue()不是一個初始常量(到執行時才能確定的值就不是constant值了),所以此時需要給B初始值

字串列舉:

在一個字串列舉裡,每個成員都必須用字串字面量,或另外一個字串列舉成員進行初始化

enum a {
  Up = "Up",
  Down = "DOWN",
  Left = "LEFT"
, Right = "RIGHT" }

計算的和常量成員


// 以下所有列舉成員都是常量
enum E { X }
enum E1 { X, Y, Z }
enum E2 {
    A = 1, B, C
}
 
enum FileAccess {
    None,
    Read    = 1 << 1,
    Write   = 1 << 2,
    ReadWrite  = Read | Write,
    // computed member
    G = "123".length
}

聯合列舉與列舉成員的型別

當列舉成員成為了型別


enum ShapeKind {
    Circle,
    Square,
}
 
interface Circle {
    kind: ShapeKind.Circle;
    radius: number;
}
 
interface Square {
    kind: ShapeKind.Square;
    sideLength: number;
}
 
let c: Circle = {
    kind: ShapeKind.Square,
    //    ~~~~~~~~~~~~~~~~ Error!
    radius: 100
}

當列舉型別本身變成了每個列舉成員的 聯合