TypeScript中通过泛型约束实现参数与返回值类型联动的核心方式是单个泛型参数+extends约束+类型推导;基础模式如<T extends object, K extends keyof T>(obj: T, key: K): T[K],进阶可用条件类型与infer提取深层类型。

用泛型约束建立参数与返回值的类型联动
TypeScript 中最核心的方式是通过 单个泛型参数 + extends 约束 + 类型推导,让编译器自动关联输入和输出。不是靠手动写多个泛型或硬编码类型,而是让类型系统“看懂”你传了什么,就该返回什么。
基础模式:泛型 T 受限于某个结构,返回值直接基于 T 推导
例如一个安全的属性获取函数,要求传入的对象必须有某个键,且返回值类型精确对应那个键的类型:
<T extends object, K extends keyof T>(obj: T, key: K): T[K]
这里:
• T extends object 确保第一个参数是对象类型
• K extends keyof T 表示 key 必须是 T 的合法键名(类型级依赖)
• 返回类型 T[K] 就是“根据 T 和 K 联动计算出的具体值类型”,不是 any,也不是宽泛的 unknown
进阶联动:用条件类型 + 泛型组合表达更复杂的映射逻辑
当返回值不是简单索引访问,而是需要按参数类型做分支判断时,可结合条件类型:
立即学习“Java免费学习笔记(深入)”;
<T>(input: T): T extends string ? number : T extends number ? string : boolean
但要注意:这种写法在调用时仍需保证 T 能被准确推断(比如不能传 {} 或 any)。更稳健的做法是把约束前移:
<T extends string | number | boolean>(input: T): T extends string ? number : T extends number ? string : boolean
这样既限制了输入范围,又让返回值能随输入类型精确变化。
实用技巧:用 infer 提取嵌套结构,实现深层联动
比如处理 Promise 或数组这类包装类型,想让函数返回“解包后”的类型:
<T>(promise: Promise<T>): T
<T>(arr: T[]): T
这已经隐含联动。若要更灵活,可用 infer:
<T>(val: T): T extends Promise<infer U> ? U : T extends (infer U)[] ? U : T
此时传入 Promise<string>,返回就是 string;传入 number[],返回就是 number —— 类型完全由参数结构决定,无需额外标注。


















