深入理解 TypeScript 的 Record 類型

在 TypeScript 中,Record 是一種實用的內建泛型類型,它允許我們定義對象的鍵和值的類型。Record 類型的使用在處理鍵值對資料結構時非常有幫助,可以為對象的鍵和值提供強類型支持。本文將詳細介紹 Record 類型的定義、用途以及實際使用案例。

Record 類型的定義

Record 類型是 TypeScript 提供的一個泛型類型,它接受兩個類型參數:

1
Record<Keys, Type>;
  • Keys:對象的鍵的類型,通常是字符串、數字或聯合類型。
  • Type:對象的值的類型。

Record 的作用是將對象的所有鍵映射到特定的值類型。例如,如果我們希望對象的所有鍵都是字符串類型,且值都是數字類型,可以使用 Record<string, number>

使用場景

Record 類型特別適合以下場景:

  1. 管理對象的鍵值對資料結構:當我們需要創建一個鍵值對結構的對象,並且對鍵和值的類型有嚴格要求時,Record 非常有用。
  2. 替代索引簽名:與索引簽名不同,Record 可以提供更精確的鍵類型和值類型控制。
  3. 用於字典資料結構Record 可以用來表示具有固定鍵的字典結構。

程式碼範例

基本用法

以下範例展示了如何使用 Record 類型來定義對象,其中鍵是字符串,值是數字:

1
type Scores = Record<string, number>;
2
3
const studentScores: Scores = {
4
Alice: 85,
5
Bob: 92,
6
Charlie: 78,
7
};
8
9
console.log(studentScores);
10
// 輸出: { Alice: 85, Bob: 92, Charlie: 78 }

在這個例子中,studentScores 對象的所有鍵都是字符串類型,值都是數字類型。

使用聯合類型作為鍵

我們還可以使用聯合類型來限制對象的鍵。例如,如果我們希望對象的鍵只能是特定的字符串,可以這樣定義:

1
type Role = "admin" | "user" | "guest";
2
3
type RolePermissions = Record<Role, string[]>;
4
5
const permissions: RolePermissions = {
6
admin: ["create", "edit", "delete"],
7
user: ["view", "edit"],
8
guest: ["view"],
9
};
10
11
console.log(permissions);
12
// 輸出: { admin: ['create', 'edit', 'delete'], user: ['view', 'edit'], guest: ['view'] }

在這個例子中,RolePermissions 類型確保 permissions 對象的鍵只能是 'admin''user''guest'

與可選屬性結合使用

可以結合 RecordPartial 類型,使所有屬性變為可選:

1
type PersonInfo = {
2
name: string;
3
age: number;
4
};
5
6
type PartialPersonInfo = Partial<Record<"Alice" | "Bob", PersonInfo>>;
7
8
const partialInfo: PartialPersonInfo = {
9
Alice: { name: "Alice", age: 30 },
10
// Bob 資訊可選
11
};
12
13
console.log(partialInfo);
14
// 輸出: { Alice: { name: 'Alice', age: 30 } }

在這個例子中,Partial<Record<'Alice' | 'Bob', PersonInfo>> 定義了一個對象類型,鍵可以是 'Alice''Bob',值是 PersonInfo 類型,但所有屬性都是可選的。

結論

TypeScript 的 Record 類型是一種強大且靈活的工具,適用於需要精確定義對象鍵和值類型的場景。它不僅簡化了類型定義,還增強了程式碼的可讀性和安全性。通過結合其他類型工具,如 PartialPickOmit,開發者可以輕鬆處理複雜的資料結構,顯著提升程式碼的質量和維護性。