源本科技 | 码上会

TypeScript 中的泛型

2026/04/14
3
0

引言

泛型是一种在定义函数、类、接口时使用的参数化类型,它可以让我们在使用这些构造时灵活指定具体类型。通过泛型,既能在编译时保证类型安全,又能大幅提升代码的复用性与灵活性,是 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" };

总结

  1. 核心价值:泛型实现类型安全 + 代码复用,替代 any 类型,保留完整的类型检查;

  2. 基础用法:泛型函数(工具方法)、泛型类(数据容器)、泛型接口(数据约束);

  3. 高级能力extends 约束类型、自动类型推断、泛型默认值,适配绝大多数开发场景;

  4. 工程化:泛型是封装通用组件、API 接口、工具函数的核心语法。