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

前端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中的两个重要概念。 交叉类型&#xff08;&&#xff09;可以用来组合多个接口&#xff0c;形成一个新接口。它类似于接口继承&#xff08;extends&#xff09;&#xff0c;但有一些区别。交叉类型不会产生类型继承层次结构&#xff0c;而是将多…...

科聪协作(复合)移动机器人整体解决方案

协作&#xff08;复合&#xff09;移动机器人&#xff08;AGV/AMR&#xff09;相较传统工业机器人具有更加安全和简单的工作优势&#xff0c;具备较强的发展潜力。协作&#xff08;复合&#xff09;移动机器人安全性和操作的简洁性、灵活性不断提高,优势得到了充分发挥,在越来越…...

RTE(Runtime Environment)

RTE&#xff08;Runtime Environment&#xff09;是一个运行时环境&#xff0c;在这个环境里&#xff0c;你可以实现的功能是&#xff1a; 作为一个缓冲buffer给应用层和BSW层的接口&#xff08;例如COM&#xff09;用来存储数据&#xff0c;也就是说定义一个全局变量供上层和下…...

搭建自己的搜索引擎——oh-my-search使用

搭建自己的搜索引擎——oh-my-search使用 使用elasticsearch和search-ui搭建自己的搜索引擎&#xff0c;快速查找资源和文件。如果对代码感兴趣&#xff0c;相关代码已在github上开源&#xff0c;欢迎fork代码。 搭建elasticsearch 先搭建eleasticsearch再搭建kibana 搭建e…...

微信小程序实现文章内容详情

方案一、使用微信小程序官方提供的webview 前提已经在微信公众平台开发管理配置好了安全域名即&#xff1a; 方案二、把网页转成pdf直接展示 前提已经在微信公众平台开发管理配置好了安全域名即&#xff1a; 实现思路是发起网络请求拿到pdf下载地址&#xff0c;然后wx.download…...

行情分析——加密货币市场大盘走势(10.27)

目前大饼开始了震荡盘整&#xff0c;目前远离EMA21均线&#xff0c;预计会有大的回调动作。而MACD日线来看&#xff0c;昨日和今日开始呈现绿色空心柱&#xff0c;也在说明大饼在做震荡盘整。不排除大跌的可能性&#xff0c;大饼可以开始布局中长线空单&#xff0c;可以再35000…...

设计模式:桥接模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

上一篇《适配器模式》 下一篇《装饰器模式》 简介&#xff1a; 桥接模式&#xff0c;它是一种结构型设计模式&#xff0c;它的主要目的是将抽象部分与具体实现部分分离&#xff0c;使它们都可以独立地变化。…...

error: the following arguments are required: --model, --data 解决方法

错误原因&#xff1a;Windows下需要缺乏配置参数&#xff0c;需要进行相关参数配置。 解决办法&#xff1a;在Pycharm的编辑设置&#xff0c;加上–model--model ****,其中****为指定的模型名称&#xff0c;按照自己实际报错进行添加&#xff0c;比如我这里要跑的模型为bert&am…...

Kafka - 消息队列的两种模式

文章目录 消息队列的两种模式点对点模式&#xff08;Point-to-Point&#xff0c;P2P&#xff09;发布/订阅模式&#xff08;Publish/Subscribe&#xff0c;Pub/Sub&#xff09; 小结 消息队列的两种模式 消息队列确实可以根据消息传递的模式分为 点对点模式发布/订阅模式 这两…...

【Go】格式化字符串指令大全 Redis常用命令

【Go】格式化字符串指令大全 && Redis常用命令 原创&#xff1a;As.Kai 博客地址&#xff1a;https://blog.csdn.net/qq_42362997 如果以下内容对您有帮助&#xff0c;点赞点赞点赞~ 目录 格式化格式化字符串指令大全%s 用于插入字符串%d 用于插入整数%f 用于插入浮点数…...

Windows 和 Linux 这2个系统在进行编程实现的时候的一些区别:

很惭愧&#xff0c;学了很多年才意识到&#xff0c;噢&#xff0c;原来这两个系统实现一些功能的时候会使用到不同的库&#xff0c;使用不同的函数。 那么&#xff0c;也会延伸出一些问题&#xff1a; 比如&#xff0c;如何实现版本的迁移。一个在Linux上运行的代码如何可以比…...

[SQL开发笔记]SQL 别名:为表名称或列名称指定别名

一、功能描述&#xff1a; 通过使用 SQL&#xff0c;可以为表名称或列名称指定别名。基本上&#xff0c;创建别名是为了让列名称的可读性更强。 二、SQL 别名语法详解&#xff1a; &#xff08;1&#xff09;列的 SQL 别名语法&#xff1a; Select column_name AS alias_nam…...

风险管理案例题

本文摘抄自江山老师高项文档 规划风险 管理 1 、 没进行规划风险管理 2 、 风险管理计划编制存在问题 &#xff0c; 独自一人完成而没有邀请项目组其他成员参与 3 、 仅仅参照以前的项目模板编制风险管理计划 4 、 风险管理计划没有经过项目组讨论直接签字下发实施 &#xf…...

NFC读卡器ST25R3911B-AQWT、ST25R3917B-AQET、ST25R3919B-AQET产品描述、功能框图

一、ST25R3911B 1.4 W功耗可支持VHBR和AAT的高性能HF读卡器 / NFC发起设备 ST25R3911B 是高度集成的NFC发起设备 / HF读卡器IC&#xff0c;包括模拟前端&#xff08;analog front end&#xff0c;AFE&#xff09;和一个高度集成的数据帧系统&#xff0c;可用于ISO 18092&#…...

JVM进阶(2)

一)方法区: java虚拟机中有一个方法区&#xff0c;该区域被所有的java线程都是共享&#xff0c;虚拟机一启动&#xff0c;运行时数据区就被开辟好了&#xff0c;官网上说了方法区可以不压缩还可以不进行GC&#xff0c;JAVA虚拟机就相当于是接口&#xff0c;具体的HotSpot就是虚…...

2023大湾区杯粤港澳金融数学建模竞赛思路+模型+代码

目录 一.思路模型见文末名片&#xff0c;比赛开始第一时间更新 二.大湾区杯常用算法之主成分分析法(PCA) 三.MATLAB代码 四.国赛建模思路获取见此 一.思路模型见文末名片&#xff0c;比赛开始第一时间更新 二.大湾区杯常用算法之主成分分析法(PCA) 主成分分析法(PCA)是一种…...

【Note详细图解】中缀表达式如何转为后缀表达式?数据结构

中缀表达式 中缀表达式&#xff08;中缀记法&#xff09;是一个通用的算术或逻辑公式表示方法&#xff0c;操作符是以中缀形式处于操作数的中间&#xff08;例&#xff1a;3 4&#xff09;&#xff0c;中缀表达式是人们常用的算术表示方法。 前缀或后缀记法不同的是&#xf…...

常用到的资源共享网站

1 资源共享 比你优秀的人都比你努力,你有什么理由不去努力。基础来自己的累秒累天累月的积累 没有一个人是从天而降的天才,也没有哪个人想做一个一生贫庸的人。今天我想说受人以鱼 不如受人以渔。 2 Java 开发软件的官网总结如下: Oracle Java 官网(https://www.oracle.com…...

关于JAVA中字节码文件版本号、产品版本号及开发版本号的关系

目录 关于字节码版本对应关系清单关于字节码格式说明的资料关于这些版本号 关于字节码版本 以二进制打开字节码文件&#xff1a; 如上图中第5-8标识&#xff08;圈起来的&#xff09;的即字节码版本号 十六进制&#xff1a; 34 十进制&#xff1a; 52 jdk 8 对应关系清单 …...

ModbusTCP 转 Profinet 主站网关在博图配置案例

兴达易控ModbusTCP转Profinet网关&#xff0c;在 Profinet 侧做为 Profinet 主站控制器&#xff0c;接 Profinet 设备&#xff0c;如伺服驱动器&#xff1b;兴达易控ModbusTCP 和 Profinet网关在 ModbusTCP 侧做为 ModbusTCP 从站&#xff0c;接 PLC、上位机、wincc 屏等。 拓…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...