function <T> 泛型函数
最后更新:2026-10-22
function <T> 泛型函数
泛型函数用类型参数 <T> 把"类型"变成参数:同一段逻辑适配多种类型,入参与返回值类型联动。它比 any 安全(保留类型信息),比复制粘贴多份代码省事。
| 分组 | 泛型 |
|---|---|
| 类型 | 语法 |
| 严格模式 | 不需要 |
ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。
📝 语法
function identity<T>(value: T): T {
return value;
}
// 多个类型参数 + 约束
function pick<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K>;
⚙️ 参数
| <T> | 调用时由实参推断或显式指定;命名惯例 T/U/V 表示通用类型,K 表示键,E 表示元素 |
|---|---|
| K extends keyof T | 约束:K 只能是 T 的键名联合,越界键名编译报错 |
返回值:由类型参数表达——返回值可与入参同类型(T)或按映射/索引联动(Pick<T, K>)。
▶ 示例
修改下面的代码,点击试一试查看转译运行结果:
输出:
{"id":1,"name":"Charlie"}
(转译后运行输出;把 "age" 传入 keys 会得到类型错误——K 被 keyof T 约束)
💡 要点
ℹ️ 说明 泛型在转译后完全消失——运行时不存在 T,只有普通函数;类型联动全部发生在编译期。
💡 提示 返回值类型尽量用类型参数表达(如 Pick<T, K>),而不是手写一个宽泛的返回类型——调用方拿到的是"联动后的精确类型"。
⚠️ 注意 泛型不是越多越好:单一类型就够时写 T 反而增加阅读成本;先写具体版本,出现重复再抽象成泛型。
🏷️ 相关泛型
💡 相关案例
更多案例即将上线。
📚 相关教程
❓ 常见问题
Q 泛型和 any 有什么区别?
A any 会抹掉类型信息(入参和返回值断联,后续全无检查);泛型保留类型联动(identity(42) 的返回值就是 number)。泛型是"安全的 any 替代"。
Q 什么时候该把函数写成泛型?
A 当"参数类型与返回值类型存在联动"或"同一段逻辑要适配多种类型"时。典型信号:你正准备写 any、或正在为不同类型复制粘贴同一段函数。
Q <T, K extends keyof T> 该怎么读?
A 声明两个类型参数:T 是任意类型;K 是 T 的键名之一(受 keyof T 约束)。调用 pick(user, ["id"]) 时 T=user 的类型、K="id",返回值类型就是 { id: number }。