泛型让类型成为参数,延迟到使用时确定。约束 T extends X 限定 T 必须满足某结构,从而在函数体内安全访问 X 的成员;默认参数 T = Default 在调用方不指定时兜底。例:function pick<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K>——K 被约束为 T 的键,返回值精确到所选键。

常见模式:T extends Record<string, unknown> 约束对象、T extends (...args: unknown[]) => unknown 约束函数。易错点:泛型位置的 extends 是「约束」不是条件类型;不写约束时不能把 T 当具体类型用;类型推导优先——能推出来的让调用方省略显式标注。TS 5.0 的 const 类型参数可让字面量不被宽化。追问:泛型方差(协变/逆变)、infer 与泛型的配合。

function first<T extends readonly unknown[]>(arr: T): T[number] { return arr[0] }