掌握 TypeScript 實用型別工具 Utility Types
在現代 Web 應用程式的開發中,TypeScript 已經成為一個不可或缺的程式語言。在 TypeScript 中,有一組非常強大的工具稱為 Utility Types,它可以幫助開發者輕鬆地操縱和轉換現有的型別,既可以減少重複定義類似的型別,也可以提高程式碼的可讀性。我在這篇文章中參考了 Hannah Lin 的文章,將 TypeScript 的 Utility Types 也整理為幾個類別,使讀者更容易理解和記住這些工具。
我根據 Utility Types 的功能將其分成以下幾大類:
- 屬性操作類型
- 提取和排除類型
- 函數和實例操作類型
- 字串操作類型
這篇文章將介紹一些常見的 utility types,並展示它們的用法。
屬性操作類型
Partial<T>:將屬性設置為可選
Partial<T> 允許我們將某個類型的所有屬性設定為可選。
interface User {
id: number;
name: string;
age: number;
}
type PartialUser = Partial<User>;
// Infer:
// type PartialUser = {
// id?: number;
// name?: string;
// age?: number;
// }
const updateUser: PartialUser = {
name: "John",
};
Required<T>:將屬性設置為必需
Required<T> 將某個類型的所有屬性設定為必需。
interface User {
id?: number;
name?: string;
age?: number;
}
type RequiredUser = Required<User>;
// Infer:
// type RequiredUser = {
// id: number;
// name: string;
// age: number;
// }
const newUser: RequiredUser = {
id: 1,
name: "Jane",
age: 30,
};
Readonly<T>:將屬性設置為唯讀
Readonly<T> 可以將某個類型的所有屬性設定為唯讀,防止這些屬性被修改。
interface User {
id: number;
name: string;
age: number;
}
type ReadonlyUser = Readonly<User>;
// Infer:
// type ReadonlyUser = {
// readonly id: number;
// readonly name: string;
// readonly age: number;
// }
const readonlyUser: ReadonlyUser = {
id: 1,
name: "Jane",
age: 30,
};
// readonlyUser.id = 2; // Error: Cannot assign to 'id' because it is a read-only property.
Record<K, T>:構建一個物件類型,其屬性鍵是類型 K,屬性值是類型 T。
Record<K, T> 是用來建構一個物件類型,其屬性鍵是類型 K,屬性值是類型 T。
type Page = "home" | "about" | "contact";
interface PageInfo {
title: string;
}
type Pages = Record<Page, PageInfo>;
// Infer:
// type Pages = {
// home: PageInfo;
// about: PageInfo;
// contact: PageInfo;
// }
const pages: Pages = {
home: { title: "Home" },
about: { title: "About Us" },
contact: { title: "Contact" },
};
提取與排除類型
Pick<T, K>:從某個類型中挑選一組屬性來構建新類型
Pick<T, K> 從某個類型中挑選一組屬性來建構新類型。
interface User {
id: number;
name: string;
age: number;
email: string;
}
type UserPreview = Pick<User, "id" | "name">;
// Infer:
// type UserPreview = {
// id: number;
// name: string;
// }
const userPreview: UserPreview = {
id: 1,
name: "Jane",
};