深入理解 TypeScript 的 Record 類型
- 764字
- 4分鐘
- 2024-07-30
在 TypeScript 中,Record
是一種實用的內建泛型類型,它允許我們定義對象的鍵和值的類型。Record
類型的使用在處理鍵值對資料結構時非常有幫助,可以為對象的鍵和值提供強類型支持。本文將詳細介紹 Record
類型的定義、用途以及實際使用案例。
Record 類型的定義
Record
類型是 TypeScript 提供的一個泛型類型,它接受兩個類型參數:
1Record<Keys, Type>;
Keys
:對象的鍵的類型,通常是字符串、數字或聯合類型。Type
:對象的值的類型。
Record
的作用是將對象的所有鍵映射到特定的值類型。例如,如果我們希望對象的所有鍵都是字符串類型,且值都是數字類型,可以使用 Record<string, number>
。
使用場景
Record
類型特別適合以下場景:
- 管理對象的鍵值對資料結構:當我們需要創建一個鍵值對結構的對象,並且對鍵和值的類型有嚴格要求時,
Record
非常有用。 - 替代索引簽名:與索引簽名不同,
Record
可以提供更精確的鍵類型和值類型控制。 - 用於字典資料結構:
Record
可以用來表示具有固定鍵的字典結構。
程式碼範例
基本用法
以下範例展示了如何使用 Record
類型來定義對象,其中鍵是字符串,值是數字:
1type Scores = Record<string, number>;2
3const studentScores: Scores = {4 Alice: 85,5 Bob: 92,6 Charlie: 78,7};8
9console.log(studentScores);10// 輸出: { Alice: 85, Bob: 92, Charlie: 78 }
在這個例子中,studentScores
對象的所有鍵都是字符串類型,值都是數字類型。
使用聯合類型作為鍵
我們還可以使用聯合類型來限制對象的鍵。例如,如果我們希望對象的鍵只能是特定的字符串,可以這樣定義:
1type Role = "admin" | "user" | "guest";2
3type RolePermissions = Record<Role, string[]>;4
5const permissions: RolePermissions = {6 admin: ["create", "edit", "delete"],7 user: ["view", "edit"],8 guest: ["view"],9};10
11console.log(permissions);12// 輸出: { admin: ['create', 'edit', 'delete'], user: ['view', 'edit'], guest: ['view'] }
在這個例子中,RolePermissions
類型確保 permissions
對象的鍵只能是 'admin'
、'user'
或 'guest'
。
與可選屬性結合使用
可以結合 Record
和 Partial
類型,使所有屬性變為可選:
1type PersonInfo = {2 name: string;3 age: number;4};5
6type PartialPersonInfo = Partial<Record<"Alice" | "Bob", PersonInfo>>;7
8const partialInfo: PartialPersonInfo = {9 Alice: { name: "Alice", age: 30 },10 // Bob 資訊可選11};12
13console.log(partialInfo);14// 輸出: { Alice: { name: 'Alice', age: 30 } }
在這個例子中,Partial<Record<'Alice' | 'Bob', PersonInfo>>
定義了一個對象類型,鍵可以是 'Alice'
或 'Bob'
,值是 PersonInfo
類型,但所有屬性都是可選的。
結論
TypeScript 的 Record
類型是一種強大且靈活的工具,適用於需要精確定義對象鍵和值類型的場景。它不僅簡化了類型定義,還增強了程式碼的可讀性和安全性。通過結合其他類型工具,如 Partial
、Pick
和 Omit
,開發者可以輕鬆處理複雜的資料結構,顯著提升程式碼的質量和維護性。