typescript泛型是类型系统核心能力而非语法糖,通过声明类型参数实现跨类型安全复用,支持多参数、约束(extends)、泛型类/接口/类型别名,避免any导致的类型丢失。

TypeScript 中的泛型不是语法糖,而是类型系统的核心能力——它让一个函数能安全地适配多种类型,同时保留完整的类型信息。关键不在于“怎么写”,而在于“为什么这样写更可靠”。
泛型函数的基本写法
用
- 函数签名里写
function first<t>(arr: T[]): T | undefined</t>,表示“无论数组里是什么类型,返回值就是那个类型或 undefined” - 调用时可显式指定:
first<string>(['a', 'b'])</string>,也可靠类型推断:first([1, 2, 3])→ 返回类型自动为number | undefined - T 不限于一个,多个类型可用逗号分隔:
<k v></k>,适合处理键值对、映射等场景
避免 any 的典型复用场景
不用泛型时,常靠 any 或重复写函数,结果是类型丢失或代码膨胀:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 比如拼接数组:
['a','b'].join(',')和[1,2].join(',')逻辑一致,但元素类型不同;用function join<t>(arr: T[], sep: string): string</t>就能统一处理 - 再如 API 响应解包:
interface ApiResponse<t> { code: number; data: T; message: string }</t>,后续所有接口只需写ApiResponse<user></user>或ApiResponse<product></product> - 工具函数如
pick<t k extends keyof t>(obj: T, keys: K[]): Pick<t k></t></t>,既能约束 key 合法性,又保证返回类型精确
加约束让泛型更实用
泛型默认接受任意类型,但很多操作需要类型具备某些特征(比如有 length 或能比较大小):
- 用
extends限制范围:function logLength<t extends length: number>(x: T)</t>,确保传入对象一定有length属性 - 组合多个约束:
<t extends record unknown> & { id: number }></t>表示既要是一般对象,又要带id - 内置约束如
keyof T、typeof、ReturnType<f></f>都是泛型配合类型运算的自然延伸,不是额外语法,而是类型系统的连贯表达
泛型类和接口增强结构复用
不只是函数能泛型化,整个结构都可以按需注入类型:
- 容器类:
class Stack<t> { private items: T[] = []; push(item: T) { this.items.push(item); } pop(): T | undefined { return this.items.pop(); } }</t> - 泛型接口定义行为契约:
interface Mapper<in out> { map(input: In): Out; }</in>,实现时可明确输入输出关系 - 类型别名也能泛型化:
type AsyncResult<t promise success: boolean data t error string></t>,一处定义,多处复用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










