TypeScript 泛型與條件型別
2025年7月2日
- 使用
<T>
建立可重複使用的函式與型別 - 配合
extends
限定型別範圍 - 內建工具型別如
Partial
、Pick
、Record
非常實用 - 條件型別讓你能根據邏輯自動推斷型別
範例:泛型函式
function identity<T>(value: T): T {
return value;
}
const result = identity<number>(123);
範例:泛型約束與 keyof
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const user = { name: "Tom", age: 30 };
const userName = getProperty(user, "name");
常見工具型別
type User = {
id: number;
name: string;
age?: number;
};
type UserPartial = Partial<User>; // 所有屬性都可選
type UserRequired = Required<User>; // 所有屬性皆為必填
type UserReadonly = Readonly<User>; // 所有屬性不可改動
type NameOnly = Pick<User, "name">; // 只包含 name 屬性
type WithoutAge = Omit<User, "age">; // 排除 age 屬性
type UserRecord = Record<"a" | "b", string>; // { a: string; b: string }
條件型別與 infer 推斷
type GetReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
type Foo = () => number;
type Bar = GetReturnType<Foo>; // number
新手常見錯誤與觀念混淆
- 混用
any
導致型別保護失效 - 誤以為泛型一定要寫成
<T>
,其實可以是任何有意義的名稱 - 誤用
keyof
與in
導致推斷錯誤 - 不知道
infer
僅能在條件型別內部使用 - 不熟工具型別的限制,導致誤用(如 Pick 時選不存在的鍵)
想知道 Vue3 的生命週期嗎?參考: Vue3 生命週期