extends 做约束:<"> extends 做约束:<"> extends 做约束:<">
TypeScript 词条目录
前端Wiki/TypeScript/进阶/泛型

泛型约束与默认值

泛型默认是"任意类型",有时想限定范围——用 extends 做约束:<T extends { length: number }> 表示 T 至少要有 length 属性。泛型里的 extends 不是继承,而是"满足条件"。

泛型还能设默认值 <T = string>,不传参时回退。约束配合 keyof 操作符,就能实现类型安全的属性访问——这是 Pick、Record 等工具类型的底层机制。

  • :限定类型参数必须满足的形状
  • :调用不传参时的回退值
  • keyof T 取类型的所有键联合;T[K] 按键取值类型
TS
// 约束:T 必须有 length 属性
function logLength<T extends { length: number }>(x: T): number {
  return x.length;
}
logLength('abc');         // ✓ string 有 length
logLength([1, 2]);        // ✓ 数组有 length
// logLength(123);        // ❌ number 没有 length

// keyof:安全取属性(pick 的玩具版)
function pick<T, K extends keyof T>(obj: T, key: K): T[K] {
  return obj[key];
}
const v = pick({ name: '小明', age: 18 }, 'name');   // string
// pick(obj, 'nam');      // ❌ 拼错键名直接报错

// 泛型默认值
interface ApiResponse<T = unknown> { code: number; data: T }
const r: ApiResponse = { code: 0, data: 'ok' };    // data 为 unknown
JS
// 约束也只在编译期存在
function logLength(x) { return x.length; }
console.log(logLength('abc'));      // 3
console.log(logLength([1, 2]));     // 2

function pick(obj, key) { return obj[key]; }
console.log(pick({ name: '小明', age: 18 }, 'name'));   // 小明
本节要点泛型约束用 extends 限定范围;keyof + T[K] 实现类型安全的属性访问。