第6章:泛型
泛型的基本概念
什么是泛型?
泛型(Generics)是 TypeScript 中用于创建可复用、类型安全的组件的重要特性。它允许我们在定义函数、接口或类时不预先指定具体类型,而是在使用时再指定类型,从而增强代码的灵活性和类型安全性。
泛型的核心思想
类型参数化
通过类型变量(如<T>)将类型作为参数传递,使代码可以处理多种类型而非单一类型。function identity<T>(arg: T): T { return arg; }代码复用性
同一段逻辑可以适用于不同类型,避免重复编写相似代码。类型约束
在灵活性的同时保持类型检查,避免运行时错误。
为什么需要泛型?
通过一个例子对比非泛型与泛型实现的差异:
非泛型实现的问题
// 只能处理 number 类型
function getNumberArray(items: number[]): number[] {
return items;
}
// 需要为 string 类型重复编写逻辑
function getStringArray(items: string[]): string[] {
return items;
}
泛型实现的优势
// 一个函数处理所有类型
function getArray<T>(items: T[]): T[] {
return items;
}
// 使用示例
const numArray = getArray<number>([1, 2, 3]); // T 被推断为 number
const strArray = getArray<string>(['a', 'b']); // T 被推断为 string
泛型类型参数命名规范
- 通常使用单个大写字母作为类型变量名,常见约定:
T(Type)K(Key)V(Value)E(Element)
- 复杂的场景可使用描述性名称(如
TResponse)
泛型的应用场景
函数参数与返回值类型关联
function pair<T, U>(first: T, second: U): [T, U] { return [first, second]; }集合类数据结构
class Stack<T> { private items: T[] = []; push(item: T) { /*...*/ } pop(): T | undefined { /*...*/ } }API 响应包装
interface ApiResponse<T> { data: T; status: number; }
类型推断的自动应用
TypeScript 能根据上下文自动推断泛型类型:
// 不需要显式指定 <number>
const result = identity(42); // T 被推断为 number
关键点总结
- 泛型通过类型参数提供类型抽象能力
- 在保持类型安全的同时减少代码重复
- 广泛应用于函数、类、接口等场景
- 类型推断可简化泛型调用语法
