TypeScript 從 0 開始 Ep-3

本篇重點

在上一篇教學中,我們介紹了 TypeScript 中的函式、介面與型別別名,這些功能幫助我們更好的組織程式碼並提升型別安全性,接下來本我們繼續進一步探討 TypeScript 中的 Enums(列舉)Tuples(元組),它們能夠幫助你更精確地定義資料結構與型別。


Enums(列舉)

Enums 是 TypeScript 提供的一種特殊型別,用來定義一組具名的常數,Enums 可以讓程式碼更具可讀性。

1. 基本 Enums

最簡單的 Enums 就是數字列舉(Numeric Enums),它會自動為每個成員分配一個從 0 開始的數字值。

1
2
3
4
5
6
7
8
9
enum Direction {
North, // 0
East, // 1
South, // 2
West, // 3
}

const currentDirection: Direction = Direction.North;
console.log(currentDirection); // 0

你也可以手動指定列舉成員的值:

1
2
3
4
5
6
7
8
9
enum Direction {
North = 1,
East = 2,
South = 3,
West = 4,
}

const currentDirection: Direction = Direction.North;
console.log(currentDirection); // 1

2. 字串列舉(String Enums)

除了數字列舉,也能夠使用字串列舉來給,每個成員指定一個字串值。

1
2
3
4
5
6
7
8
9
enum Direction {
North = "NORTH",
East = "EAST",
South = "SOUTH",
West = "WEST",
}

const currentDirection: Direction = Direction.North;
console.log(currentDirection); // "NORTH"

3. 混合列舉(Heterogeneous Enums)

TypeScript 也支援混合列舉,即列舉成員可以同時包含數字和字串值,但這種用法並不常見,通常建議保持列舉成員的一致性。

1
2
3
4
5
6
7
enum MixedEnum {
Num = 1,
Str = "TWO",
}

console.log(MixedEnum.Num); // 1
console.log(MixedEnum.Str); // "TWO"

4. 常數列舉(Const Enums)

常數列舉是一種特殊的列舉,它會在編譯時被完全移除,並且在執行時不會產生任何額外的程式碼,只需要在 enum 前加上關鍵字 const 這可以減少程式碼的體積,但會失去一些列舉的動態特性。

1
2
3
4
5
6
7
8
9
const enum Direction {
North = 1,
East = 2,
South = 3,
West = 4,
}

const currentDirection: Direction = Direction.North;
console.log(currentDirection); // 1

5. Enums 的應用場景

Enums 適合用來定義一組固定的值,例如:

  • 方向(上、下、左、右)
  • 狀態(進行中、已完成、已取消)
  • 角色(管理員、編輯者、訪客)

Tuples(元組)

Tuples 是 TypeScript 中的另一種特殊型別,它允許你定義一個固定長度的陣列,並且每個元素的型別可以不同,適合用來處理需要嚴格型別檢查的資料結構。

1. 基本 Tuples

Tuples 的宣告方式與陣列類似,但需要明確指定每個元素的型別。

1
2
3
4
5
let user: [string, number, boolean] = ["John", 25, true];

console.log(user[0]); // "John"
console.log(user[1]); // 25
console.log(user[2]); // true

2. 可選元素

從 TypeScript 3.0 開始,Tuples 支援可選元素。你可以使用 ? 來標記某個元素是可選的。

1
2
3
4
5
let user: [string, number?, boolean?] = ["John"];

console.log(user[0]); // "John"
console.log(user[1]); // undefined
console.log(user[2]); // undefined

3. 剩餘元素(Rest Elements)

也支援剩餘元素,你可以將多個元素打包成一個陣列。

1
2
3
4
5
let user: [string, ...number[]] = ["John", 1, 2, 3, 4];

console.log(user[0]); // "John"
console.log(user[1]); // 1
console.log(user[2]); // 2

4. Tuples 的應用場景

Tuples 非常適合用來處理以下情境:

  • 函式回傳多個值
  • 定義固定長度的資料結構(例如座標、RGB 顏色值)
  • 處理需要嚴格型別檢查的資料
1
2
3
4
5
6
function getCoordinates(): [number, number] {
return [10, 20];
}

const [x, y] = getCoordinates();
console.log(x, y); // 10, 20

Enums 與 Tuples 的比較

特性 Enums Tuples
定義方式 使用 enum 關鍵字 使用 [type1, type2, ...] 語法
主要用途 定義一組具名的常數 定義固定長度的陣列,每個元素型別可以不同
型別檢查 嚴格檢查列舉成員的值 嚴格檢查每個元素的型別與順序
應用場景 方向、狀態、角色等固定值 函式回傳多個值、座標、RGB 顏色值等
可選元素 不支援 支援(從 TypeScript 3.0 開始)
剩餘元素 不支援 支援

結論

在本篇中,我們深入探討了 TypeScript 中的 Enums 與 Tuples,包括:

  • Enums 的基本使用、字串列舉、混合列舉與常數列舉
  • Tuples 的基本使用、可選元素與剩餘元素
  • Enums 與 Tuples 的應用場景與比較

這些功能能夠幫助你更精確的定義資料結構與型別,並提升程式碼的可讀性與安全性。


延伸閱讀