泛型约束与默认值
泛型默认是"任意类型",有时想限定范围——用 extends 做约束:<T extends { length: number }> 表示 T 至少要有 length 属性。泛型里的 extends 不是继承,而是"满足条件"。
泛型还能设默认值 <T = string>,不传参时回退。约束配合 keyof 操作符,就能实现类型安全的属性访问——这是 Pick、Record 等工具类型的底层机制。
:限定类型参数必须满足的形状 :调用不传参时的回退值 - keyof T 取类型的所有键联合;T[K] 按键取值类型
// 约束: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// 约束也只在编译期存在 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')); // 小明




