泛型在TypeScript中的核心作用是让函数、接口或类能“记住”传入的类型并约束输入输出,实现参数与返回值的类型强关联;它通过<T>声明类型变量作为占位符,在参数和返回值中复用该类型,支持显式指定(如identity<string>("hello"))和自动推断(如identity(42)),避免any导致的类型信息丢失,确保类型安全与代码复用。

泛型在 TypeScript 中的核心作用,就是让函数、接口或类能“记住”你传入的类型,并用它来约束输入和输出,从而实现参数与返回值的类型强关联。
泛型函数的基本定义方式
在函数名后加尖括号 <T> 声明一个类型变量(如 T),然后在参数和返回值中使用它:
-
T是占位符,不代表具体类型,只表示“调用时传进来的那个类型” - 参数类型写成
arg: T,返回值写成: T,就自然建立了关联 - 不需要手动写
any或重复定义多个版本函数
两种调用方式:显式指定与自动推断
泛型函数既支持你明确告诉编译器类型,也支持让 TypeScript 自己猜:
完整的Galileo AI平台 TypeScript/JS SDK 参考,用于评估、观察和保护 GenAI 应用。适用于构建 Node.js 或 TypeScript 项目。
- 显式写法:
identity<string>("hello")—— 类型信息清晰,适合复杂场景或推断失败时 - 隐式写法:
identity("hello")—— 编译器从参数值(字符串字面量)推出T是string - 数组取首项例子:
getFirst([1, 2, 3])→ 推出T = number,返回值类型也是number
为什么必须用泛型而不是 any?
用 any 看似灵活,但会丢失类型信息:
-
function getFirst(arr: any[]): any—— 调用后返回值是any,无法做字符串方法调用或数字运算 -
function getFirst<T>(arr: T[]): T—— 返回值类型和数组元素类型完全一致,编辑器能提示、编译器能校验 - 本质区别:泛型保留了类型关系,
any切断了类型链条
多类型参数与实际用途
一个函数可以有多个泛型参数,用于处理更复杂的类型协作:
- 例如合并两个对象:
function merge<U, V>(a: U, b: V): U & V - 参数
a类型是U,b是V,返回值是两者的交叉类型 - 常见于工具函数(如 API 响应包装、状态映射、过滤器等)

















