news 2026/5/25 22:31:03

TypeScript 泛型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TypeScript 泛型

TypeScript 泛型(Generics)详解

泛型(Generics)是 TypeScript 最强大、最核心的特性之一。它允许你创建可重用、类型安全的组件,在不牺牲类型检查的前提下,让函数、类、接口等能够处理多种类型,而不是固定为某种特定类型。

泛型的核心思想:“类型变量”—— 用占位符(如<T>)表示类型,在使用时再指定具体类型。

1. 泛型函数(Generic Functions)
基础示例:身份函数(Identity Function)
// 普通函数(无泛型)functionidentity(arg:number):number{returnarg;}// 使用 any(失去类型安全)functionidentityAny(arg:any):any{returnarg;}// let output: string = identityAny(123); // 不会报错,但不安全// 泛型版本(推荐)functionidentity<T>(arg:T):T{returnarg;}// 使用时指定类型letnumOutput:number=identity<number>(123);letstrOutput:string=identity<string>("hello");// 或依靠类型推断(最常用)letboolOutput=identity(true);// 类型自动推断为 boolean
多个泛型参数
functionmerge<T,U>(obj1:T,obj2:U):T&U{return{...obj1,...obj2};}letmerged=merge({name:"Alice"},{age:30});// merged 类型:{ name: string; } & { age: number; } → { name: string; age: number; }
2. 泛型接口(Generic Interfaces)
interfaceGenericArray<T>{items:T[];add(item:T):void;get(index:number):T;}// 使用letnumberArray:GenericArray<number>={items:[1,2,3],add(item){this.items.push(item);},get(index){returnthis.items[index];}};letstringArray:GenericArray<string>={items:["a","b"],add(item){this.items.push(item);},get(index){returnthis.items[index];}};
3. 泛型类(Generic Classes)
classBox<T>{privatecontent:T;constructor(initial:T){this.content=initial;}set(value:T):void{this.content=value;}get():T{returnthis.content;}}// 使用letnumberBox=newBox<number>(100);numberBox.set(200);console.log(numberBox.get());// 200letstringBox=newBox<string>("hello");stringBox.set("world");// stringBox.set(123); // 错误:类型不匹配
4. 泛型约束(Constraints)—— 限制 T 的范围

默认情况下,T可以是任何类型,有时需要限制它具有某些属性。

// 约束 T 必须有 length 属性functionprintLength<Textends{length:number}>(arg:T):void{console.log(arg.length);}printLength("hello");// OKprintLength([1,2,3]);// OKprintLength({length:10,value:5});// OK// printLength(123); // 错误:number 没有 length
使用 keyof 约束键
functiongetProperty<T,KextendskeyofT>(obj:T,key:K):T[K]{returnobj[key];}letperson={name:"Alice",age:30};letname=getProperty(person,"name");// 类型:stringletage=getProperty(person,"age");// 类型:number// getProperty(person, "email"); // 错误:email 不存在
5. 默认泛型参数(Default Type Parameters,TS 2.3+)
interfaceApiResponse<T=any>{data:T;status:number;}// 使用时可省略letresponse:ApiResponse={data:"ok",status:200};// 或指定letjsonResponse:ApiResponse<string[]>={data:["a","b"],status:200};
6. 常见泛型应用场景
场景示例
数组工具函数function first<T>(arr: T[]): T
PromisePromise<T>(TS 内置)
React 组件function List<T>(props: { items: T[] })
类型安全的工厂函数function create<T>(c: new () => T): T
映射类型type Partial<T> = { [K in keyof T]?: T[K] }
7. 内置泛型工具类型(Utility Types)

TypeScript 自带大量基于泛型的工具类型:

类型作用示例
Partial<T>所有属性可选Partial<User>
Required<T>所有属性必选
Readonly<T>所有属性只读
Pick<T, K>挑选属性`Pick<User, “name”
Omit<T, K>排除属性Omit<User, "password">
Record<K, T>创建键值对象类型Record<string, number>
ReturnType<T>获取函数返回值类型ReturnType<typeof fetch>
Parameters<T>获取函数参数元组
8. 最佳实践建议
建议说明
优先让 TS 自动推断泛型identity("hi")而非identity<string>("hi")
使用约束避免过度宽松T extends { id: number }
泛型函数名后写<T>保持一致性
避免泛型嵌套过深可读性优先
结合接口/类使用泛型构建可复用组件
多用内置工具类型减少手动编写复杂类型
小结:泛型速查表
写法含义
function fn<T>(arg: T): T基本泛型函数
T extends U约束 T 必须继承 U
K extends keyof T键约束
class Box<T>泛型类
interface List<T>泛型接口
Promise<T>内置泛型示例
Partial<T>工具类型示例

泛型是 TypeScript 从“类型安全脚本语言”提升为“工业级类型系统”的关键。掌握泛型后,你可以编写高度可复用、类型严谨的库和应用(如 React、NestJS、RxJS 等都大量使用泛型)。

如果您想看更多实战示例(如泛型组件在 React 中的使用高级条件泛型泛型递归类型),或者需要一个完整的泛型工具库示例,请告诉我!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 20:20:40

并行编程实战——CUDA编程的内核循环展开

一、循环展开 开发经验相对丰富一些的程序员应该对循环展开并不陌生&#xff0c;特别是有过循环优化方面的经历的可能了解的会更深刻一些。循环是对CPU占用比较多的一种情况&#xff0c;如果在每次循环中再有大量的计算情况下&#xff0c;可能效果会更差。此时可以通过一定的方…

作者头像 李华
网站建设 2026/5/26 4:27:51

基于大数据的校园点餐系统设计与实现-计算机毕业设计源码+LW文档

摘 要 随着社会的不断发展&#xff0c;互联网数据时代的到来&#xff0c;数据的背后是什么&#xff0c;数据有什么用&#xff0c;怎么用庞大的数据来呈现出数据的价值&#xff0c;让我们一起去揭开它神秘的面纱。基于大数据的校园点餐系统是一种创新性的餐饮服务模式&#xff…

作者头像 李华
网站建设 2026/5/26 4:27:50

Excalidraw AI改善客户沟通体验

Excalidraw AI&#xff1a;重塑客户沟通的智能可视化实践 在一次跨国售前会议中&#xff0c;客户用带着口音的英语描述着他们的系统需求&#xff1a;“我们想要一个能处理高并发订单的服务……前端要快&#xff0c;后端要稳&#xff0c;中间可能还需要缓存。”团队成员一边点头…

作者头像 李华
网站建设 2026/5/26 4:28:16

【Open-AutoGLM书籍阅读全记录】:揭秘AI时代高效阅读的5大核心技术

第一章&#xff1a;Open-AutoGLM书籍阅读全记录的背景与意义随着大语言模型技术的迅猛发展&#xff0c;如何高效地理解、复现并拓展前沿研究成果成为开发者和研究者面临的核心挑战。Open-AutoGLM 作为开源社区中聚焦自动化阅读与知识提取的代表性项目&#xff0c;旨在通过大模型…

作者头像 李华
网站建设 2026/5/26 4:28:15

为什么顶尖团队都用Open-AutoGLM做自动化?自定义任务模块深度拆解

第一章&#xff1a;为什么顶尖团队选择Open-AutoGLM 在人工智能快速演进的当下&#xff0c;顶尖技术团队对自动化大语言模型&#xff08;LLM&#xff09;开发平台的需求日益增长。Open-AutoGLM 凭借其高度模块化架构与强大的任务自适应能力&#xff0c;成为众多头部研发团队的首…

作者头像 李华
网站建设 2026/5/26 4:35:53

C++ 自定义排序与优先队列运算符重载

写这部分代码引起的一些思考并总结一、 优先队列的底层逻辑 (Worldview)1. 核心矛盾&#xff1a;为什么用 < 却是“大根堆”&#xff1f;std::priority_queue 的行为逻辑与其命名看似矛盾&#xff0c;实则遵循了 STL 的一致性设计。默认属性&#xff1a;priority_queue Max…

作者头像 李华