TypeScript 泛型與條件型別

2025年7月2日

  • 使用 <T> 建立可重複使用的函式與型別
  • 配合 extends 限定型別範圍
  • 內建工具型別如 PartialPickRecord 非常實用
  • 條件型別讓你能根據邏輯自動推斷型別

範例:泛型函式


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>,其實可以是任何有意義的名稱
  • 誤用 keyofin 導致推斷錯誤
  • 不知道 infer 僅能在條件型別內部使用
  • 不熟工具型別的限制,導致誤用(如 Pick 時選不存在的鍵)

想知道 Vue3 的生命週期嗎?參考: Vue3 生命週期

© 2025 Frontend Starter Map. Made with ❤️ using Nuxt 3.

有任何問題歡迎來信討論:

a0912383019@gmail.com