Typescript——泛型

一、问题的引入

需求:创建一个函数,我想要传入啥参数,就返回啥,传入的参数和返回的值的类型相同,那么针对这个需求,我们应该如何去做,大家很快就会想到下面的这种办法。

functionhhh(value:number):number{returnvalue}

但是这样写只能接收数字们不能适合其他的类型,这样就不能实现需求,

那如何写呢?

functionhhh(value:any):any{returnvalue}

这样将参数的类型修改成any,这个能实现,但是意义在哪,这不就失去了TS最本身的对类型的保护了吗,这样写实在是不安全。

那么我们该如何写:

functionhhh<Type>(value:Type):Type{returnvalue}functionhhh<T>(value:T):T{returnvalue}

二、什么是泛型?

泛型就是可以在保证类型安全的前提下,让函数等多种类型一起工作,从而去实现复用。

常见使用的地方:函数、接口、class中。

定义泛型函数:
functionhhh<Type>(value:Type):Type{returnvalue}functionhhh<T>(value:T):T{returnvalue}

在函数名称的后面添加 <>(尖括号),尖括号中添加类型变量,比如此处的 Type ,是一种特殊类型的变量,它处理类型而不是值该类型变量相当于一个类型容器,能够捕获用户提供的类型,就是你写的是啥类型,就会可以给你捕获出来,可以实现任意合法变量传入和返回值需求的实现。

泛型函数的调用:
constnum=hhh<number>(10)conststr=hhh<string>('a')
简化的写法:
// 省略 <number> 调用函数letnum=hhh(10)letstr=hhh('a')
  • 推荐:使用这种简化的方式调用泛型函数,使代码更短,更易于阅读

  • 说明:当编译器无法推断类型或者推断的类型不准确时,就需要显式地传入类型参数

三、泛型的约束

默认情况下,泛型函数的类型变量 Type 可以代表多个类型,这导致无法访问任何属性,比如length属性,这个时候就要为泛型添加约束来收缩类型。有两个方式:

直接指定添加的具体的类型
functionid<Type>(value:Type[]):Type[]{console.log(value.length)returnvalue}

这个时候就能访问这个length属性了。

添加约束
  1. 创建描述约束的接口 ILength,该接口要求提供 length 属性

  2. 通过 extends关键字使用该接口,为泛型(类型变量)添加约束

  3. 该约束表示:传入的类型必须具有 length 属性

// 创建一个接口interfaceILength{length:number}// Type extends ILength 添加泛型约束functionhhh<TypeextendsILength>(value:Type):Type{console.log(value.length)returnvalue}

四、泛型可以有多个变量类型

泛型的类型变量可以有多个,并且类型变量之间还可以约束(比如,第二个类型变量受第一个类型变量约束) 比如,创建一个函数来获取对象中属性的值:

functionhhh<Type,KeyextendskeyofType>(obj:Type,key:Key){returnobj[key]}letperson={name:'jack',age:18}hhh(person,'name')

五、泛型接口和泛型的配合

// 泛型接口作为函数返回值类型interfaceResult<T>{success:boolean;data:T;}// 函数返回泛型接口,适配不同返回值类型functiongetResult<T>(data:T):Result<T>{return{success:true,data};}// 使用:传入字符串,返回Result<string>constres1=getResult("Hello 泛型");// 传入对象,返回Result<{name: string}>constres2=getResult({name:"张三"});
  • 泛型接口核心:interface 接口名 { … },用T占位类型;

  • 使用时:接口名<具体类型>,比如Data、Result;

  • 优势:一套接口适配多种类型,不用重复写多个相似接口。

六、总结

核心解决的问题

  • 泛型弥补了 “单一类型函数复用性差” 和 “any 类型丢失类型保护” 的缺陷,既能实现函数 / 接口 / 类的通用化,又能严格约束输入输出的类型一致性。

核心语法与使用

  • 定义:在函数 / 接口 / 类名称后通过<T>(T 为类型变量,可自定义命名)声明泛型,T 作为 “类型容器” 捕获用户传入的具体类型;

  • 调用:推荐省略显式类型(如hhh(10)),TS 会自动推断类型,仅在推断失效时显式指定(如hhh<string>('a'))。

关键扩展能力

  • 泛型约束:通过extends关键字收缩类型范围(如Type extends ILength),解决泛型无法访问属性的问题;

  • 多泛型变量:支持多个类型变量且可相互约束(如Key extends keyof Type),适配对象属性访问等复杂场景;

  • 泛型接口:接口定义时声明<T>,使用时指定具体类型(如Result<string>),实现一套接口适配多类数据结构。

核心优势

  • 兼顾 “复用性” 与 “类型安全”,避免重复编写相似的类型定义,同时保留 TS 的类型校验能力,是实现通用化、可扩展 TS 代码的核心手段。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1210613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win11 轻松设置更新暂停至 2042年告别过度弹窗 卸载系统冗余软件

时隔两年更新的Windows11 轻松设置 1.12 正式版&#xff0c;整合六大核心模块&#xff0c;一个工具就能替代多款零散小工具&#xff0c;Win11 系统优化、个性化设置全搞定&#xff0c;比单独用其他工具便捷太多&#xff01; 软件下载地址 软件功能清晰划分六大板块&#xff0c…

实战复盘:如何用 HTML+JS+AI 打造一款“影迹”智能影视管理系统

在数字化时代&#xff0c;我们囤积了大量的影视资源链接&#xff08;百度网盘、夸克网盘&#xff09;&#xff0c;但它们通常以杂乱的 TXT 文本形式存在。只有链接&#xff0c;没有海报&#xff1b;只有片名&#xff0c;没有评分。 为了解决这个痛点&#xff0c;我开发了**“影…

从对象结构到锁机制:Java 对象锁与类锁深度解析

从对象结构到锁机制&#xff1a;Java 对象锁与类锁深度解析 Java 的并发控制中&#xff0c;synchronized 是最经典的内置锁机制。它基于 JVM 的对象结构实现&#xff0c;分为对象锁&#xff08;实例锁&#xff09;和类锁&#xff08;静态锁&#xff09;。下面从对象内存布局入…

什么是 Java 中的原子性、可见性和有序性?

Java 中的原子性、可见性、有序性 是多线程编程中最核心的三个特性&#xff0c;也称为“并发三要素”或“happens-before 关系的三大保证”。 它们直接决定了代码在多线程环境下是否能得到“预期”的执行结果。下面用最直白的方式解释三者的含义、为什么会丢失、以及 Java 是如…

2000亿美元!2026年全球游戏行业的新格局与新变量

2000亿美元&#xff01;2026年全球游戏行业的新格局与新变量 2026年&#xff0c;全球游戏市场规模预计突破2000亿美元&#xff08;约2050-2100亿美元&#xff09;&#xff0c;从2025年的1888-1970亿美元增长3-7%。 这标志着后疫情低迷期的复苏&#xff08;增长率从2022-2024的…

使用 wxPython 构建文件编辑器与预览器:从零到一的完整实现

一、背景 在日常开发工作中&#xff0c;我们经常需要快速编辑和预览文本文件&#xff0c;特别是 HTML 和 Markdown 文档。虽然市面上有许多成熟的编辑器&#xff0c;但有时我们需要一个轻量级、定制化的解决方案来满足特定需求。 C:\pythoncode\new\wx_file_editor.py 传统的…

从零构建轻量级企业考勤订饭系统:Node.js + SQLite 全栈实战复盘

在中小企业的日常管理中&#xff0c;考勤和午餐统计往往是一件琐碎但必须处理好的小事。市面上的SaaS软件要么功能过于臃肿&#xff0c;要么价格昂贵&#xff1b;而纯手工的Excel记录又容易出错且难以协同。 C:\myApp\attendance-enterprise 本文将详细复盘如何使用 Node.js S…

python如何发送邮件

以下是一个使用Python发送邮件的示例代码&#xff0c;包含基础配置和附件功能&#xff1a; import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders import …

【课程设计/毕业设计】基于Springboot的在线游戏商城系统基于springboot的游戏售卖商城系统【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Python如何识别周围WiFi:跨平台实现与进阶技巧

在物联网设备管理、网络安全审计或智能家居场景中&#xff0c;识别周围WiFi网络是基础需求。Python凭借其丰富的生态库&#xff0c;能够跨平台实现WiFi扫描、信号强度检测及网络分析。本文将系统梳理主流方法&#xff0c;结合代码示例与性能对比&#xff0c;帮助开发者快速构建…

一键生成100条小红书笔记!DeepSeek+火兔工具箱的组合太牛了!

做小红书博主的痛谁懂啊&#xff1f;熬3小时写1篇笔记&#xff0c;流量寥寥无几&#xff1b;想日更却被选题、排版、违禁词轮番卡壳&#xff0c;账号常年停留在几百粉&#xff1b;更头疼的是批量运营时&#xff0c;多平台切换能耗光半天精力。其实不是你不够努力&#xff0c;只…

【毕业设计】基于springboot的助农扶贫系统(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

2026年上海企业管理咨询公司权威推荐:卓越绩效模式/ 绩效模式 /绩效分析模式/ 团队绩效模式/高绩效心理建设源头服务商精选

在充满活力的上海,企业管理咨询行业正随着经济转型而快速发展。据统计,上海目前拥有各类管理咨询服务机构超过5000家,服务范围覆盖战略规划、数字化转型、人力资源优化、精益生产及绩效提升等关键领域。面对如此众多…

雅思网上辅导终极榜单推荐|2026 雅思网上辅导实测 全国适配机构汇总

本次测评由雅思官方教研合作单位联合第三方教育质量监测中心发起,依据《雅思辅导服务能力评估准则(2026版)》,覆盖80个城市260个区县,结合38000+考生及家长实测反馈、240家雅思教育机构全维度核验,形成这份兼具权…

Router_T000_ConceptMECE

startmindmap* 汇报总图** 动机价值*** 故事钩子*** 价值主张** 现状基线*** 基线速览*** SafeDreamer*** UNISafe外盾*** SPOWL** 问题缺陷*** 主流缺陷*** OOD幻觉*** 外盾不学*** 固定阈值** 创新方案*** 核心创新*** Risk-Bellman*** ucert内生*** 不改环境奖*** 插入点** …

离散化详解

离散化 两种 第二种不理解,实际没什么用 第一种: 离散化是由于数据个数少而数据最大值很大时要将数据直接作为数组下标时空间过大时而为了减小空间占用又不破坏数据关系的一种方法 离散化本质上可以看成是一种 哈希 …

山东一卡通(礼遇卡)哪里回收方便,1分钟变现技巧

在逢年过节时收到的福利卡或者礼品卡中,山东一卡通(礼遇卡)并不少见。不少人手中的山东一卡通因用不上长期闲置,既担心过期浪费,又不知该如何妥善处置。找到便捷的回收方式,让闲置山东一卡通快速处理,成为很多人…

Java毕设选题推荐:基于springboot的游戏售卖商城系统基于SpringBoot+Vue的游戏装备交易商城系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

计算机Java毕设实战-基于springboot的游戏售卖商城系统游戏攻略资讯补丁售卖系统 游戏道具商城【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Java计算机毕设之基于springboot+vue的游戏装备账号销售商城平台系统基于springboot的游戏售卖商城系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…