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 }。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏