TypeScript 泛型:2025 年终极指南

原文链接 TypeScript Generics: The Ultimate Guide, 2025 - 作者 Andre K.

大家好!

本文,我们将探讨 TypeScript 中的泛型,它们是什么?并且怎么去使用它们?

TypeScript 中的泛型是一个功能强大的工具,便于编写可复用性和类型安全的代码。不管你是新手还是老手开发者,掌握泛型将会提升你的 TypeScript 技能。

在这个完整的指南中,我们将学到:

  • 什么是泛型,并且为什么要掌握
  • 在函数,接口和类中,如何使用泛型
  • 真实案例中的最佳实践
  • 高级模式(条件类型,映射类型等)

最后,我们将在 TypeScript 中很自信地使用泛型。下面开始进入主题👇

1. TypeScript 中的泛型是什么?

泛型允许我们在不牺牲类型安全的前提下编写弹性和可复用的组件。当处理不同的数据类型时,泛型允许我们保留类型,而不是使用 any

用什么使用泛型?

  1. 避免代码重复 - 编写一个函数来涵盖不同类型
  2. 更好的类型引用 - 自动补全和错误提示
  3. any 更安全 - 严格的类型维护,而没有运行时错误

基本的泛型案例👇

typescript 复制代码
function identity<T>(arg: T): T {
  return arg;
}

// 使用
const output = identity("Hello Generics from ITsoftMake.COM"); // 类型:字符串
const numOutput = identity(42); // 类型:数字

在这里,<T> 是一个类型变量,来捕获输入的类型。

2. 在函数中使用泛型

泛型函数👇

typescript 复制代码
function logAndReturn<T>(value: T): T {
  console.log(value);
  return value;
}

const result = logAndReturn(23); // 打印出: 23

多个类型参数👇

typescript 复制代码
function merge<T, U>(obj1: T, obj2: U): T & U {
  return { ...obj1, ...obj2 };
}

const merged = merge({ name: "Andre" }, { age: 30 }); // { name: "Andre", age: 30 }

3. 在接口和类中使用泛型

泛型接口👇

typescript 复制代码
interface ApiResponse<T> {
  data: T;
  status: number;
}

const userResponse: ApiResponse<{ name: string }> = {
  data: { name: "Ritesh" },
  status: 200,
}

泛型类👇

typescript 复制代码
class DataStorage<T> {
  private data: T[] = [];
  
  addItem(item: T) {
    this.data.push(item);
  }
  
  getItems(): T[] {
    return this.data;
  }
}

const stringStorage = new DataStorage<string>();
stringStorage.addItem("TypeScript Generics - Hi from ITsoftMake.COM");

4. 高级泛型模式

默认泛型类型👇

typescript 复制代码
function fetchData<T = string>(url: string): Promise<T> {
  return fetch(url).then(res => res.json());
}

通过继承 extends 进行约束👇

typescript 复制代码
interface HasId {
  id: number;
}

function getById<T extends HasId>(items: T[], id: number): T | undefined {
  return items.find(item => item.id === id);
}

条件型类型👇

typescript 复制代码
type CheckNumber<T> = T extends number ? "Yes" : "No";
type A = CheckNumber<42>; // "Yes"
type B = CheckNumber<"TS">; // "No"

5. 真实使用案例

API 包装(通过类型安全进行获取)👇

typescript 复制代码
async function fetchUser<T>(userId: string): Promise<T> {
  const response await fetch(`/api/users/${userId}`);
  return response.json();
}

const user = await fetchUser<{ name: string }>("123");

实用函数(比如:mapfilter 等)👇

typescript 复制代码
function mapArray<T, U>(arr: T:[], mapper: (item: T => U)): U[] {
  return arr.map(mapper);
}

const numbers = [1, 2, 3];
const doubled = mapArray(numbers, x => x * 2); // [2, 4, 6];

6. 常见错误和最佳实践

是否推荐 理由
NO 过度使用 any 而不是泛型 -> 会丢失类型安全
YES 当需要时使用约束(extends) -> 确保正确的类型
NO 过度嵌套泛型 -> 晦涩难懂
YES 保持简单的泛型并配备相应的文档 -> 这很棒

总结

泛型让 TypeScript 容易扩展和可维护。有效地使用它们,我们可以通过下面来实现👇

  • 编写可复用的函数和类
  • 提高类型安全 而不是用 any
  • 优雅处理复杂数据结构

接下来: 尝试在我们的项目中使用泛型吧!

更多的内容官方 TypeScript 泛型文档

相关推荐
欧阳天风3 分钟前
用setTimeout代替setInterval
开发语言·前端·javascript
EndingCoder6 分钟前
箭头函数和 this 绑定
linux·前端·javascript·typescript
郑州光合科技余经理7 分钟前
架构解析:同城本地生活服务o2o平台海外版
大数据·开发语言·前端·人工智能·架构·php·生活
沐墨染9 分钟前
大型数据分析组件前端实践:多维度检索与实时交互设计
前端·elementui·数据挖掘·数据分析·vue·交互
xkxnq13 分钟前
第一阶段:Vue 基础入门(第 11 天)
前端·javascript·vue.js
lifejump13 分钟前
Pikachu | Unsafe Filedownload
前端·web安全·网络安全·安全性测试
Irene199118 分钟前
CSS新属性分类总结(2020年后引入)
前端·css
小oo呆18 分钟前
【自然语言处理与大模型】LangGraphV1.0入门指南:核心组件Nodes
前端·javascript·easyui
LongtengGensSupreme26 分钟前
后端设置了跨域但是还是提示跨域问题,原因是这里有两个独立的安全策略在起作用:Chrome和Edge浏览器安全策略强制修改方案
前端·chrome·edge·浏览器·跨域
程序员小李白27 分钟前
弹性盒子详细解析
前端·css·css3