前端TypeScript学习-交叉类型与泛型
交叉类型和泛型是TypeScript中的两个重要概念。
交叉类型(&)可以用来组合多个接口,形成一个新接口。它类似于接口继承(extends),但有一些区别。交叉类型不会产生类型继承层次结构,而是将多个接口类型合并成一个新类型。
泛型则是一种在保证类型安全前提下,让函数等与多种类型一起工作,从而实现复用的机制。泛型常用于函数、接口、class中。
交叉类型(Intersection Types)
示例:
type Person = { name: string; age: number;
}; type Employee = { salary: number; department: string;
}; type PersonAndEmployee = Person & Employee; // 交叉类型 function printInfo(person: Person): void { console.log(`Name: ${person.name}, Age: ${person.age}`);
} function printInfo(employee: Employee): void { console.log(`Salary: ${employee.salary}, Department: ${employee.department}`);
} let pae: PersonAndEmployee = { name: "John", age: 30, salary: 50000, department: "Engineering"
}; printInfo(pae); // 输出:Salary: 50000, Department: Engineering,因为 pae 既是 Person 又是 Employee
上面示例我们定义了两个类型:Person 和 Employee。Person 类型具有 name 和 age 属性,Employee 类型具有 salary、department 和 title 属性。通过使用交叉类型,我们可以创建一个同时具有 Person 和 Employee 属性的新类型 PersonAndEmployee。然后我们定义了一个 printInfo 函数,它可以接受 Person 或 Employee 类型的参数,并打印相应的信息。最后,我们创建了一个 PersonAndEmployee 类型的变量 pae,并使用 printInfo 函数打印了它的信息。由于 pae 既是 Person 又是 Employee,因此我们可以使用任意一个 printInfo 函数来打印它的信息。
优点:
方便类型定义:通过交叉类型,可以将多个接口或类型组合成一个新类型,使得类型定义更加灵活和方便。
提高代码复用:交叉类型可以在不同的类型之间共享某些属性,从而实现代码复用。
缺点:
类型复杂:交叉类型的类型定义比较复杂,容易使代码的可读性降低。
类型限制:交叉类型会限制所组合类型的属性,如果某个属性在组合类型中没有定义,则该属性不能被赋值给组合类型的变量。
使用场景:
UI组件:可以将用户界面组件定义为交叉类型,例如一个按钮组件可以同时具有“默认按钮”和“强调按钮”的属性。
对象封装:可以将对象的属性和方法定义为交叉类型,例如一个对象可以同时具有“用户信息”和“可编辑用户信息”的属性。
泛型(Generics)
示例:
function printMessage<T>(message: T): void { console.log(message);
} printMessage("Hello"); // string 类型参数
printMessage(123); // number 类型参数
printMessage({ key: "value" }); // object 类型参数
上面示例我们定义了一个泛型函数 printMessage,它接受一个类型参数 T,并打印一个 T 类型的消息。在调用 printMessage 函数时,我们可以传入任意类型的参数,例如 string、number 或 object。TypeScript 会根据传递的参数类型推断出 T 的类型,并确保传递的参数类型与 T 类型匹配。这样,我们就可以使用泛型来处理不同类型的消息,而无需为每种类型编写不同的代码。
优点:
类型安全:泛型可以确保类型在传递给函数或类时不会出现类型错误。
提高代码复用:泛型可以用于处理不同的数据类型,使得代码更加通用和复用。
类型推断:TypeScript 可以自动推断泛型参数的类型,使得代码更加简洁和易读。
缺点:
代码冗余:使用泛型时需要显式指定泛型参数的类型,这可能会导致代码冗余。
类型限制:泛型参数受到类型的限制,不能使用任意类型作为泛型参数。
使用场景:
函数参数:可以使用泛型来定义函数的参数类型,以便函数可以接受不同类型的数据。
接口定义:可以使用泛型来定义接口的类型,以便接口可以适用于不同类型的数据。
相关文章:
前端TypeScript学习-交叉类型与泛型
交叉类型和泛型是TypeScript中的两个重要概念。 交叉类型(&)可以用来组合多个接口,形成一个新接口。它类似于接口继承(extends),但有一些区别。交叉类型不会产生类型继承层次结构,而是将多…...
科聪协作(复合)移动机器人整体解决方案
协作(复合)移动机器人(AGV/AMR)相较传统工业机器人具有更加安全和简单的工作优势,具备较强的发展潜力。协作(复合)移动机器人安全性和操作的简洁性、灵活性不断提高,优势得到了充分发挥,在越来越…...
RTE(Runtime Environment)
RTE(Runtime Environment)是一个运行时环境,在这个环境里,你可以实现的功能是: 作为一个缓冲buffer给应用层和BSW层的接口(例如COM)用来存储数据,也就是说定义一个全局变量供上层和下…...
搭建自己的搜索引擎——oh-my-search使用
搭建自己的搜索引擎——oh-my-search使用 使用elasticsearch和search-ui搭建自己的搜索引擎,快速查找资源和文件。如果对代码感兴趣,相关代码已在github上开源,欢迎fork代码。 搭建elasticsearch 先搭建eleasticsearch再搭建kibana 搭建e…...
微信小程序实现文章内容详情
方案一、使用微信小程序官方提供的webview 前提已经在微信公众平台开发管理配置好了安全域名即: 方案二、把网页转成pdf直接展示 前提已经在微信公众平台开发管理配置好了安全域名即: 实现思路是发起网络请求拿到pdf下载地址,然后wx.download…...
行情分析——加密货币市场大盘走势(10.27)
目前大饼开始了震荡盘整,目前远离EMA21均线,预计会有大的回调动作。而MACD日线来看,昨日和今日开始呈现绿色空心柱,也在说明大饼在做震荡盘整。不排除大跌的可能性,大饼可以开始布局中长线空单,可以再35000…...
设计模式:桥接模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)
上一篇《适配器模式》 下一篇《装饰器模式》 简介: 桥接模式,它是一种结构型设计模式,它的主要目的是将抽象部分与具体实现部分分离,使它们都可以独立地变化。…...
error: the following arguments are required: --model, --data 解决方法
错误原因:Windows下需要缺乏配置参数,需要进行相关参数配置。 解决办法:在Pycharm的编辑设置,加上–model--model ****,其中****为指定的模型名称,按照自己实际报错进行添加,比如我这里要跑的模型为bert&am…...
Kafka - 消息队列的两种模式
文章目录 消息队列的两种模式点对点模式(Point-to-Point,P2P)发布/订阅模式(Publish/Subscribe,Pub/Sub) 小结 消息队列的两种模式 消息队列确实可以根据消息传递的模式分为 点对点模式发布/订阅模式 这两…...
【Go】格式化字符串指令大全 Redis常用命令
【Go】格式化字符串指令大全 && Redis常用命令 原创:As.Kai 博客地址:https://blog.csdn.net/qq_42362997 如果以下内容对您有帮助,点赞点赞点赞~ 目录 格式化格式化字符串指令大全%s 用于插入字符串%d 用于插入整数%f 用于插入浮点数…...
Windows 和 Linux 这2个系统在进行编程实现的时候的一些区别:
很惭愧,学了很多年才意识到,噢,原来这两个系统实现一些功能的时候会使用到不同的库,使用不同的函数。 那么,也会延伸出一些问题: 比如,如何实现版本的迁移。一个在Linux上运行的代码如何可以比…...
[SQL开发笔记]SQL 别名:为表名称或列名称指定别名
一、功能描述: 通过使用 SQL,可以为表名称或列名称指定别名。基本上,创建别名是为了让列名称的可读性更强。 二、SQL 别名语法详解: (1)列的 SQL 别名语法: Select column_name AS alias_nam…...
风险管理案例题
本文摘抄自江山老师高项文档 规划风险 管理 1 、 没进行规划风险管理 2 、 风险管理计划编制存在问题 , 独自一人完成而没有邀请项目组其他成员参与 3 、 仅仅参照以前的项目模板编制风险管理计划 4 、 风险管理计划没有经过项目组讨论直接签字下发实施 …...
NFC读卡器ST25R3911B-AQWT、ST25R3917B-AQET、ST25R3919B-AQET产品描述、功能框图
一、ST25R3911B 1.4 W功耗可支持VHBR和AAT的高性能HF读卡器 / NFC发起设备 ST25R3911B 是高度集成的NFC发起设备 / HF读卡器IC,包括模拟前端(analog front end,AFE)和一个高度集成的数据帧系统,可用于ISO 18092&#…...
JVM进阶(2)
一)方法区: java虚拟机中有一个方法区,该区域被所有的java线程都是共享,虚拟机一启动,运行时数据区就被开辟好了,官网上说了方法区可以不压缩还可以不进行GC,JAVA虚拟机就相当于是接口,具体的HotSpot就是虚…...
2023大湾区杯粤港澳金融数学建模竞赛思路+模型+代码
目录 一.思路模型见文末名片,比赛开始第一时间更新 二.大湾区杯常用算法之主成分分析法(PCA) 三.MATLAB代码 四.国赛建模思路获取见此 一.思路模型见文末名片,比赛开始第一时间更新 二.大湾区杯常用算法之主成分分析法(PCA) 主成分分析法(PCA)是一种…...
【Note详细图解】中缀表达式如何转为后缀表达式?数据结构
中缀表达式 中缀表达式(中缀记法)是一个通用的算术或逻辑公式表示方法,操作符是以中缀形式处于操作数的中间(例:3 4),中缀表达式是人们常用的算术表示方法。 前缀或后缀记法不同的是…...
常用到的资源共享网站
1 资源共享 比你优秀的人都比你努力,你有什么理由不去努力。基础来自己的累秒累天累月的积累 没有一个人是从天而降的天才,也没有哪个人想做一个一生贫庸的人。今天我想说受人以鱼 不如受人以渔。 2 Java 开发软件的官网总结如下: Oracle Java 官网(https://www.oracle.com…...
关于JAVA中字节码文件版本号、产品版本号及开发版本号的关系
目录 关于字节码版本对应关系清单关于字节码格式说明的资料关于这些版本号 关于字节码版本 以二进制打开字节码文件: 如上图中第5-8标识(圈起来的)的即字节码版本号 十六进制: 34 十进制: 52 jdk 8 对应关系清单 …...
ModbusTCP 转 Profinet 主站网关在博图配置案例
兴达易控ModbusTCP转Profinet网关,在 Profinet 侧做为 Profinet 主站控制器,接 Profinet 设备,如伺服驱动器;兴达易控ModbusTCP 和 Profinet网关在 ModbusTCP 侧做为 ModbusTCP 从站,接 PLC、上位机、wincc 屏等。 拓…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...
解析“道作为序位生成器”的核心原理
解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制,重点解析"道作为序位生成器"的核心原理与实现框架: 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...
