当前位置: 首页 > 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 可以自动推断泛型参数的类型,使得代码更加简洁和易读。

缺点:

代码冗余:使用泛型时需要显式指定泛型参数的类型,这可能会导致代码冗余。
类型限制:泛型参数受到类型的限制,不能使用任意类型作为泛型参数。

使用场景:

函数参数:可以使用泛型来定义函数的参数类型,以便函数可以接受不同类型的数据。
接口定义:可以使用泛型来定义接口的类型,以便接口可以适用于不同类型的数据。

http://www.lryc.cn/news/208248.html

相关文章:

  • 科聪协作(复合)移动机器人整体解决方案
  • RTE(Runtime Environment)
  • 搭建自己的搜索引擎——oh-my-search使用
  • 微信小程序实现文章内容详情
  • 行情分析——加密货币市场大盘走势(10.27)
  • 设计模式:桥接模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)
  • error: the following arguments are required: --model, --data 解决方法
  • Kafka - 消息队列的两种模式
  • 【Go】格式化字符串指令大全 Redis常用命令
  • Windows 和 Linux 这2个系统在进行编程实现的时候的一些区别:
  • [SQL开发笔记]SQL 别名:为表名称或列名称指定别名
  • 风险管理案例题
  • NFC读卡器ST25R3911B-AQWT、ST25R3917B-AQET、ST25R3919B-AQET产品描述、功能框图
  • JVM进阶(2)
  • 2023大湾区杯粤港澳金融数学建模竞赛思路+模型+代码
  • 【Note详细图解】中缀表达式如何转为后缀表达式?数据结构
  • 常用到的资源共享网站
  • 关于JAVA中字节码文件版本号、产品版本号及开发版本号的关系
  • ModbusTCP 转 Profinet 主站网关在博图配置案例
  • 抖音上怎么挂小程序?制作小程序挂载抖音视频
  • AI新能量!FortiGate NGFW面向数据中心全面集成FortiGuard AI 安全服务
  • Git总结
  • 初级前端面试题(一) 之 html/css/js
  • python实现excel的数据提取
  • Vue的MVVM实现原理
  • vue+iView 动态侧边栏菜单保持高亮选中
  • 标准的听觉检测环境应满足哪些条件?
  • Fabric.js 样式不更新怎么办?
  • 【优选算法精品】前缀和
  • 应用案例|基于高精度三维机器视觉引导机器人自动分拣包裹的应用