typescript高级类型-类型兼容性

news2024/11/27 17:40:49

4.2类型兼容性
两种类型系统:1StructuralType System (结构化类型系统)2 NominalType System (标明类型系统)。
TS 采用的是结构化类型系统,也叫做 ducktyping (鸭子类型…?什么???你不明白什么叫鸭子类型? 伟大的鲁迅先生说过如果一个东西,看起来是鸭子,叫起来像鸭子,吃起来像鸭子,那它就是鸭子!!!),
类型检查关注的是值所具有的形状。
也就是说,在结构类型系统中,如果两个对象具有相同的形状,则认为它们属于同一类型。

class Point  x: number; y: number
class Point2D { x: number; y: number
const p: Pointt= new Point2DC

解释:

  1. Point和Point2D是两个名称不同的类
  2. 变量p的类型被显示标注为Point类型,但是,它的值却是Point2D 的实例,并且没有类型错误。
  3. 因为TS 是结构化类型系统,只检查Point和 oint2D 的结构是否相同(相同,都具有和y 两个属性,属性类型也相同)。
  4. 但是,如果在NominalType System 中(比如,C#、Java等),它们是不同的类,类型无法兼容。

对象间的兼容性

tips
:在结构化类型系统中,如果两个对象具有相同的形状,则认为它们属于同一类型,这种说法并不准确。
更准确的说法: 对于对象类型来说,y 的成员至少与相同,则X 兼容y(成员多的可以赋值给少的)。

class Point  x: number; y: number
class Point3D [ x: number; y: number; z: numberconst p: 
Point = new Point3()

解释:
Point3D的成员至少与Point相同,则Point兼容Point3D
2.所以,成员多的Point3D可以赋值给成员少的Point。

接口之间的兼容性

除了class 之外,TS中的其他类型也存在相互兼容的情况,包括:1接口兼容性2函数兼容性等接口之间的兼容性,类似于 class。并且,class和 interface 之间也可以兼容。

//声明一个拥有两个number成员接口Point
interface Point { x: number; y: number }
//声明一个拥有两个number成员接口Point2D
interface Point2D { x: number; y: number }

// 声明一个变量p1,类型为Point 
let p1: Point = { x: 10, y: 20 };
//声明一个变量p2 类型为ponit2D,并将p1赋值给它
// 可以看到并没有报错
// 因为接口也拥有兼容性,只要结构一致
let p2: Point2D = p1

//再声明一个拥xyz有三个number成员接口的Point3D
interface Point3D { x: number; y: number; z: number }
//声明一个Point3D类型变量p3
let p3: Point3D = { x: 10, y: 20, z: 30 }
//将p3赋值给p2
p2 = p3

// 再声明一个Point3D类
class Point3D { x: number; y: number; z: number }

//声明一个Point2D类型变量p4,将Point3D实例赋值给它
// 可以看到也没有报错
let c3: Point2D = new Point3D()

函数之间的兼容性

函数之间兼容性比较复杂,需要考虑:

  1. 参数个数
  2. 参数类型
  3. 返回值类型

参数个数 参数多的兼容参数少的(或者说,参数少的可以赋值给多的) 示例如下

// 定义一个名为 "F1" 的函数类型:没有返回值,只有一个number参数
type F1 = (a: number) => void
// 定义一个名为 "F2" 的函数类型:没有返回值,只有两个number参数
type F2 = (a: number, b: number) => void;
// 声明变量f1:类型注解为F1并初始化
let f1: F1 = (a: number) => { }
//声明一个变量f2:类型注解为f2,再将f1赋值给f2
// 可以看到并没有报错
let f2: F2 = f1

// 声明一个数组arr
const arr = ['a', 'b', 'c']
// 调用数组的foreach函数并传入一个无参箭头函数
arr.forEach(() => { })
// 调用数组的foreach函数并传入一个一个参数的箭头函数
// 可以看到因为函数的类型兼容性,多个参数的函数能兼容参数少的函数
// 所以这里没有报错
arr.forEach(x => { }) 
  1. 参数少的可以赋值给参数多的,所以,f1 可以赋值给f2。
  2. 数组 forEach 方法的第一个参数是回调函数,该示例中类型为: (value:string,index: number, array: stringl)=>void.
  3. 在J5中省略用不到的函数参数实际上是很常见的,这样的使用方式,促成了T5中函数类型之间的兼容性
  4. 并且因为回调函数是有类型的,所以,TS会自动推导出参数item、index、array的类型。

参数类型 相同位置的参数类型要相同(原始类型)或兼容(对象类型)

如下我们可以看到,当我们将拥有不同参数类型的f1赋值给f3时报错了

在这里插入图片描述

解释:函数类型F2兼容函数类型F1,因为F1和F2的第一个参数类型相同。

返回值类型** 只关注返回值类型本身即可**

如果返回值类型是原始类型,此时两个类型要相同,比如,左侧类型F5 和 F6。
如果返回值类型是对象类型,此时成员多的可以赋值给成员少的,比如,右侧类型F7 和 F8。

在这里插入图片描述

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

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

相关文章

如何下载安装 SAP HANA Studio

什么是SAP HANA Studio SAP HANA Studio 是一个基于 Eclipse 的集成开发环境(IDE),用于以 GUI 工具的形式开发和管理 SAP HANA 数据库。 SAP HANA Studio 在客户端/开发人员计算机上运行,​​并连接到 SAP HANA 服务器。 SAP HA…

上位机通过Modbus转Profinet网关与CGV300变频器通讯案例

上位机通过Modbus转Profinet网关(XD-MDPN100)与CGV300变频器通讯的案例可以实现两个不同的通信协议之间的互联互通。在这个案例中,上位机通过Modbus协议与Profinet网关进行通信,然后通过Profinet协议与CGV300变频器进行通信。 通过…

C++中的转换构造函数

在 C/C++ 中,不同的数据类型之间可以相互转换。无需用户指明如何转换的称为自动类型转换(隐式类型转换),需要用户显式地指明如何转换的称为强制类型转换。 自动类型转换示例: int a = 6;a = 7.5 + a; 编译器对 7.5 是作为 double 类型处理的,在求解表达式时,先将 a 转换…

Python Opencv实践 - 视频目标追踪MeanShift

参考资料: opencv/python标定时用到的几个函数意义_criteria opencv_是三水不是泗水的博客-CSDN博客 pythonOpenCV笔记(二十六):视频追踪(meanshift、Camshift)_cv2.meanshift_ReadyGo!!!的博客-CSDN博客…

9月19日作业

完成文本编辑器的保存工作-代码: void Widget::on_pushButton_4_clicked() {//创建保存文件对话框QString filename QFileDialog::getSaveFileName(this,"保存文件","./","All(*.*);;Text files (*.txt)");//创建一个文件对象&…

java框架-Spring-IOC

文章目录 一、组件注册包扫描组件注解0)、 ComponentScans1)、 RestController2)、 Srevice3)、 Rerpository4)、Component 导入第三方包里的组件1)、Configuration1)、Bean1)、Cond…

Vue语法--完成购物车案例

一、模版语法 1.1 插值 Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTML 解析器解析。vue将模板编译成虚拟dom,结合响应系统…

9.19数电——触发器状态机第四周作业题解计数器(部分)

触发器 RS 1.输出置0 2.置1 3.输出保持不变 S:是置位信号,为1时说要置为1;为0时要置为0; R:是复位信号,为1时就要无条件置为0,为0时保持寄存器原状态 如果要置为0,必要条件…

Putty连接服务器

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

027-从零搭建微服务-搜索服务(一)

写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue 源码地址(前端):https://gitee.com/csps…

华清远见第六课程day10作业

保纯 //保存按钮对应的槽函数 void Widget::on_saveBtn_clicked() {QString fileName QFileDialog::getSaveFileName(this, "保存文件", "./", "All(*.*);;Images (*.png *.xpm *.jpg);;Text files(*.txt);;XML …

PyG-GCN-Cora(在Cora数据集上应用GCN做节点分类)

文章目录 model.pymain.py参数设置注意事项运行图 model.py import torch.nn as nn from torch_geometric.nn import GCNConv import torch.nn.functional as F class gcn_cls(nn.Module):def __init__(self,in_dim,hid_dim,out_dim,dropout_size0.5):super(gcn_cls,self).__i…

【PyTorch 攻略】(6-7/7)

一、说明 本篇介绍模型模型的参数,模型推理和使用,保存加载。 二、训练参数和模型 在本单元中,我们将了解如何加载模型及其持久参数状态和推理模型预测。为了加载模型,我们将定义模型类,其中包含用于训练模型的神经网…

CockroachDB集群部署

CockroachDB集群部署 1、CockroachDB简介 CockroachDB(有时简称为CRDB)是一个免费的、开源的分布式 SQL 数据库,它建立在一个事务性和强一致性的键 值存储之上。它由 PebbleDB(一个受 RocksDB/leveldb 启发的 K/B 存储库)支持,并使用 Raft 分布式共识…

利用Java EE相关技术实现一个简单的Web聊天室系统

利用Java EE相关技术实现一个简单的Web聊天室系统 (1)编写一个登录页面,登录信息中有用户名和密码,分别用两个按钮来提交和重置登录信息。 (2)通过请求指派来处理用户提交的登录信息,如果用户名…

基于YOLOv8模型的烟火目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要:基于YOLOv8模型的烟火目标检测系统可用于日常生活中检测与定位烟火目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数据集…

linux中的开发工具

在刚开始使用linux的时候,我们需要在系统上写一些简单的代码,来熟悉环境以及各种指令 并且熟悉属于linux的一套开发的环境,而这对于c来说需要三个软件就可以进行简单的编码 和使用,让我们来认识一下下列工具,以及工具的…

【Java 基础篇】Java字符打印流详解:文本数据的输出利器

在Java编程中,我们经常需要将数据输出到文件或其他输出源中。Java提供了多种输出流来帮助我们完成这项任务,其中字符打印流是一个非常有用的工具。本文将详细介绍Java字符打印流的用法,以及如何在实际编程中充分利用它。 什么是字符打印流&a…

电脑丢失d3dcompiler47.dll怎么办,这个四个修复方法都可以解决

d3dcompiler_47.dll 是一个与 DirectX 相关的动态链接库文件,它包含了 DirectX 编译器的一些函数和类,对于许多应用程序和游戏来说都是必需的。如果您的系统中缺失了这个文件,可能会导致程序无法正常运行。下面我们将介绍四个修复 d3dcompile…

(图论) 1020. 飞地的数量 ——【Leetcode每日一题】

❓ 1020. 飞地的数量 难度:中等 给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个 海洋单元格、1 表示一个 陆地单元格。 一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边…