泛型是一种在定义函数、类、接口时使用的参数化类型,它可以让我们在使用这些构造时灵活指定具体类型。通过泛型,既能在编译时保证类型安全,又能大幅提升代码的复用性与灵活性,是 TypeScript 高级类型的核心。
泛型的核心作用:不预先指定具体类型,而是在使用时动态传入类型,完美平衡了代码复用与类型安全,避免使用 any 类型丢失类型检查能力。
泛型函数允许在调用时指定类型参数,实现输入输出类型绑定的安全逻辑,是日常开发最常用的泛型场景。
// 定义泛型函数:<T> 声明泛型类型参数,arg 与返回值类型均为 T
const identity = <T>(arg: T): T => {
return arg;
};
// 方式 1:手动指定泛型类型
let output1 = identity<string>("hello");
// 方式 2:类型自动推断(推荐,TS 自动根据参数推导 T 为 number)
let output2 = identity(123);在这个例子中:
<T>是泛型类型参数(T 为通用缩写,可自定义名称);参数类型与返回值类型绑定为
T,保证类型一致性;开发中优先使用类型自动推断,无需手动声明泛型类型。
泛型类用于定义通用类结构,在实例化时传入具体类型,适用于封装通用数据容器(如栈、队列、缓存类)。
// 定义泛型类,<T> 声明类型参数
class GenericClass<T> {
value: T;
constructor(value: T) {
this.value = value;
}
// 成员方法可直接使用泛型类型
getValue(): T {
return this.value;
}
}
// 手动指定类型为 number
const numObj = new GenericClass<number>(42);
// 自动推断类型为 string
const strObj = new GenericClass("TypeScript");在这个例子中:
泛型类的类型参数作用于实例属性、实例方法;
静态成员无法使用泛型类型,仅实例成员支持;
同样支持类型自动推断,简化实例化代码。
泛型接口支持两种核心形式:函数类型接口、对象结构接口,是前端接口数据约束的标准方案。
// 1. 函数类型泛型接口
interface GenericInterface<T> {
(arg: T): T;
}
// 指定泛型类型为 string
const identityFunc: GenericInterface<string> = (arg) => {
return arg;
};
// 2. 对象结构泛型接口(常用)
interface Response<T> {
code: number;
data: T;
message: string;
}
// 约束接口响应数据类型
interface User { id: number; name: string; }
const userResponse: Response<User> = {
code: 200,
data: { id: 1, name: "刃" },
message: "请求成功"
};在这个例子中:
泛型接口可灵活适配函数、对象、接口响应体等场景;
对象结构泛型接口是前端项目中封装 API 类型的必备用法。
泛型约束通过 extends 关键字限制泛型的类型范围,解决泛型内部无法访问属性 / 方法的问题,让泛型更可控。
// 定义约束:必须包含 length 属性
interface Lengthwise {
length: number;
}
// T extends Lengthwise:泛型 T 必须满足该约束
const loggingIdentity = <T extends Lengthwise>(arg: T): T => {
// 安全访问 length 属性,约束保证属性存在
console.log(arg.length);
return arg;
};
// 合法调用:数组、字符串、自定义对象均满足约束
loggingIdentity([1, 2, 3]);
loggingIdentity("hello world");
loggingIdentity({ length: 6, content: "test" });在这个例子中:
extends是泛型约束的核心关键字,限定类型的条件;约束后,泛型内部可以安全访问约束中定义的属性 / 方法;
支持多类型约束、多泛型参数等高级用法。
TypeScript 支持为泛型设置默认类型,使用时无需传参也能正常工作,提升泛型灵活性。
// 为泛型指定默认类型 string
interface Generic<T = string> {
value: T;
}
// 使用默认类型
const defaultObj: Generic = { value: "hello" };核心价值:泛型实现类型安全 + 代码复用,替代 any 类型,保留完整的类型检查;
基础用法:泛型函数(工具方法)、泛型类(数据容器)、泛型接口(数据约束);
高级能力:extends 约束类型、自动类型推断、泛型默认值,适配绝大多数开发场景;
工程化:泛型是封装通用组件、API 接口、工具函数的核心语法。