当前位置: 首页 > news >正文

TypeScript泛型:从入门到精通的全方位指南

TypeScript泛型:从入门到精通的全方位指南

前言

最近在社区看到很多小伙伴对TypeScript的泛型概念感到困惑。作为一名从Java转战前端的老兵,我想用最接地气的方式,带大家彻底搞懂这个看似高深实则简单的重要特性。

一、什么是泛型?

想象你有个万能收纳盒,可以装任何东西:书本、水杯、零食…泛型就像这个盒子上的标签,告诉TypeScript编译器:“我这里装的是什么东西”。

举个生活化的例子:

// 普通函数就像固定大小的鞋盒
function shoeBox(item: string): string {return item;
}// 泛型函数就像可调节的伸缩鞋盒
function magicBox<T>(item: T): T {return item;
}

二、为什么需要泛型?

  1. 避免重复代码:不用为每种类型都写一个函数
  2. 保持类型安全:不像any会丢失类型检查
  3. 提升代码可读性:一看就知道处理什么类型

三、基础用法详解

1. 泛型函数

// 经典identity函数
function identity<T>(arg: T): T {return arg;
}// 使用方式
let output1 = identity<string>("hello"); // 显式指定
let output2 = identity(42); // 类型推断

2. 泛型接口

interface GenericBox<T> {contents: T;
}let stringBox: GenericBox<string> = { contents: "surprise!" };
let numberBox: GenericBox<number> = { contents: 42 };

3. 泛型类

class GenericNumber<T> {zeroValue: T;add: (x: T, y: T) => T;
}let myNumber = new GenericNumber<number>();
myNumber.zeroValue = 0;
myNumber.add = (x, y) => x + y;

四、进阶技巧

1. 泛型约束

interface Lengthwise {length: number;
}function loggingIdentity<T extends Lengthwise>(arg: T): T {console.log(arg.length);return arg;
}loggingIdentity("hello"); // OK
loggingIdentity(3); // Error: number没有length属性

2. 在React中的应用

interface Props<T> {items: T[];renderItem: (item: T) => React.ReactNode;
}function List<T>({ items, renderItem }: Props<T>) {return <div>{items.map(renderItem)}</div>;
}// 使用
<List items={[1, 2, 3]} renderItem={(num) => <div key={num}>{num}</div>} 
/>;

五、常见误区

  1. 过度使用any代替泛型:失去了类型安全的优势
  2. 滥用复杂泛型:简单场景不需要多层嵌套
  3. 忽略类型推断:很多时候不需要显式指定类型

六、实战案例

1. API响应处理

interface ApiResponse<T> {code: number;data: T;message: string;
}async function fetchUser(): Promise<ApiResponse<User>> {const response = await fetch(/api/user);return response.json();
}

2. 工具函数封装

function firstElement<T>(arr: T[]): T | undefined {return arr[0];
}const nums = [1, 2, 3];
const firstNum = firstElement(nums); // 类型推断为numberconst strs = ["a", "b"];
const firstStr = firstElement(strs); // 类型推断为string

结语

泛型就像TypeScript给我们的魔法工具箱,刚开始可能觉得复杂,但一旦掌握就能写出既灵活又安全的代码。建议从简单场景开始练习,逐步应用到实际项目中。

你在使用泛型时遇到过哪些有趣的问题?欢迎在评论区分享你的经验!

http://www.xdnf.cn/news/447805.html

相关文章:

  • Linux下的c/c++开发之操作Redis数据库
  • 上网行为审计软件系统说明书:上网行为审计是什么?是干啥的?哪家好?
  • AI世界的崩塌:当人类思考枯竭引发数据生态链断裂
  • new optimizers for dl
  • 在Unity中制作拥有36年历史的游戏系列新作《桃太郎电铁世界》
  • 通过宝塔配置HTTPS证书
  • Python爬虫实战:研究拦截器,实现逆向解密
  • UI 原型设计:交互规则的三要素——重要性、原则与实践
  • 【Liblib】基于LiblibAI自定义模型,总结一下Python开发步骤
  • 小说所有设定(v3.0 preview)
  • Qml自定义组件之车辆风扇展示
  • 【Linux】掌握 setsid:让进程脱离终端独立运行
  • 三种映射方式总结
  • 第二十九节:直方图处理-直方图均衡化
  • ET ProcessInnerSender类(实体) 分析
  • ultralytics中tasks.py---parse_model函数解析
  • 求助求助,重金酬谢
  • Java知识框架
  • AIGC与数字媒体实验室解决方案分享
  • Jmeter对服务端进行压测快速上手
  • 【电路笔记 通信】8B/10B编码 高速数据传输的串行数据编码技术 论文第三部分 The 8B/10B coding map
  • HarmonyOS NEXT 适配高德地图FlutterSDK实现地图展示,添加覆盖物和移动Camera
  • OpenCV CUDA 模块中用于在 GPU 上计算两个数组对应元素差值的绝对值函数absdiff(
  • Flutter 开发入门:从一个简单的计数器应用开始
  • 操作系统-物理结构
  • 【拥抱AI】Deer-Flow字节跳动开源的多智能体深度研究框架
  • MCP:开启AI的“万物互联”时代
  • 网站安全防御
  • 北斗导航 | 接收机自主完好性监测算法综述,1980至2025年(原理,公式,代码)
  • Java版OA管理系统源码 手机版OA系统源码