Typescript -- 类型兼容

类型兼容性

typscript中的类型兼容是基于结构子类型的(子类型兼容和赋值兼容),即只使用其成员来判定是兼容,这是根据JavaScript的特性设计的,因为js中有很多匿名对象,只要y的所有成员都能在对象x中能找到,那么y=x就能成立,在强类型语言如Java中就不行。

比较对象兼容

比如在一个interface和一个class,只要interface的变量p的成员都能在class或者一个匿名对象中能找到,那么就能把这个class实例或匿名对象赋值给p,如果是对象字面量会触发严格检查操作,需要将对象字面量赋值给一个变量y,再赋值给变量p

interface Named {name: string;
}class Person {name: string;
}let p:Namedp = new Person()
p = {name:'xxxx'}
// 此时会报错 age 不兼容 Named,因为对象字面量会触发严格类型检查,可以通过 as 断言或者 中间变量y
p = {name:'xxxx',age:10}

在这里插入图片描述

函数参数兼容

函数参数也是一样,实参要兼容形参类型

在这里插入图片描述

两个函数兼容性

参数列表数量

判断函数x是否能赋值给函数y,一是从参数数量和参数类型上,函数x参数数量少的,且对应参数类型兼容的能赋值给函数 y
在这里插入图片描述

函数返回值类型,协变

一是从函数的返回值类型上,函数 x 的返回值类型必须是函数 y 的返回值类型的子类,否则报错
在这里插入图片描述

函数参数双向协变(老版本ts)

函数的参数既能赋值父类也能赋值子类

函数参数逆变

当函数 x 的参数是 函数 y 的参数的时,函数 x 也能赋值给 y ,因为函数 y 将来调用时传入的时子类如 Dog 类,那么如果此时用函数 x 替换 函数 y ,相当于函数 x 接收了 Dog 类,而函数 x 的参数类型时 Animal 父类,那么也是兼容的。

interface Animal{name:string
}
interface Dog extends Animal{bark:()=>void
}let x = (a:Animal)=>{}
let y = (d:Dog)=>{}y = x // 函数参数逆变x = y // 报错// 因为存在这种情况
function test(fn:(d:Dog)=>void){const dog = {name:'dog',bark(){}}fn(dog) // 当传入的fn是 (a:Animal)=>void 类型时,Animal类也能接收Dog子类,所以逆变的意义就在于此
}test(x)

枚举与数字之间的兼容

enum Status { Ready, Waiting };
enum Color { Red, Blue, Green };let s = Status.Ready;
s = 1 // enum 数字类型兼容
s = Color.Green;  // Error

类和对象字面和接口差不多,主要区别在于类具有静态部分和实例部分,两个类实例对象之间能否赋值不在于其类是否一直,这与Java等语言不同,A 类和 B 类的实例成员只要一致,那么就能相互赋值。但是类的私有成员和受保护成员会影响兼容性,如果目标类型包含一个私有成员,那么源类型必须包含来自同一个类的这个私有成员。 同样地,这条规则也适用于包含受保护成员实例的类型检查。 这允许子类赋值给父类,但是不能赋值给其它有同样类型的类。

class Animal {feet: number=0;constructor(name: string, numFeet: number) { }
}class Size {feet: number=0;constructor(numFeet: number) { }}let a: Animal = new Animal('',0)
let s: Size = new Size(0);a = s;  // OK
s = a;  // OK

泛型

泛型其实对于兼容性的影响在于影响其结果类型,然后在结果类型再去比较类型兼容性
如下,经过泛型推导后的类型是{},那么 x , y 的类型比较就是最终的类型比较

interface Empty<T> {
}
let x: Empty<number>;
let y: Empty<string>;x = y;  // OK, because y matches structure of x

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

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

相关文章

nginx源码分析-1

使用gdb查看函数上下文&#xff1a; gdb attach nginx的work线程 监听端口状态时&#xff1a; 断点打在ngx_http_process_request 并通过浏览器触发请求时&#xff1a;

作业--day38

1.定义一个Person类&#xff0c;包含私有成员&#xff0c;int *age&#xff0c;string &name&#xff0c;一个Stu类&#xff0c;包含私有成员double *score&#xff0c;Person p1&#xff0c;写出Person类和Stu类的特殊成员函数&#xff0c;并写一个Stu的show函数&#xff…

Springboot实现登录注册

功能&#xff1a;1、实现用户的登录 2、实现用户的注册以及重名的判断 LoginControl&#xff1a; package com.example.demo.controls;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; imp…

C#上位机与欧姆龙PLC的通信06---- HostLink协议(FINS版)

1、介绍 对于上位机开发来说&#xff0c;欧姆龙PLC支持的主要的协议有Hostlink协议&#xff0c;FinsTcp/Udp协议&#xff0c;EtherNetIP协议&#xff0c;本项目使用Hostlink协议。 Hostlink协议是欧姆龙PLC与上位机链接的公开协议。上位机通过发送Hostlink命令&#xff0c;可…

《数据库开发实践》之触发器

一、什么是触发器&#xff1f; 1.概念&#xff1a; 简单来说触发器就是一种特殊的存储过程&#xff0c;在数据库服务器触发事件的时候会自动执行其SQL语句集。 2.构成四要素&#xff1a; &#xff08;1&#xff09;名称&#xff1a;要符合标识符命名规则 &#xff08;2&am…

NFC物联网智能锁安全测试研究

针对短距离无线通信在物联网智能锁实际运用中的安全机制问题&#xff0c;通过理论分析和实际操作演示潜在的攻击流程&#xff0c;发现其存在的安全漏洞并提出可行的加固方法&#xff0c;并对加固后的通信系统进行CPN建模与安全性分析&#xff0c;对无线通信协议的安全性能提升、…

动态内存管理(2)

目录 4. 几个经典的笔试题 4.1 题目1&#xff1a; 4.2 题目2&#xff1a; 4.3 题目3&#xff1a; 4.4 题目4&#xff1a; 5. C/C程序的内存开辟 6. 柔性数组 6.1 柔性数组的特点&#xff1a; 6.2 柔性数组的使用 6.3 柔性数组的优势 4. 几个经典的笔试题 4.1 题目1&#xff1a…

生存分析序章3——生存分析之Python篇:介绍生存分析和scikit-survival库

写在开头 在现代数据科学领域&#xff0c;生存分析是一项关键的统计方法&#xff0c;用于研究个体在一定时间内事件发生的概率。无论是医学、金融还是社会科学&#xff0c;生存分析都为我们提供了一种深入洞察数据的途径。在Python生态系统中&#xff0c;有一个强大的工具——…

HarmonyOS 签名打包Hap(s)、App(s)

1. 基本概念 HarmonyOS应用通过数字证书&#xff08;.cer文件&#xff09;和Profile文件&#xff08;.p7b文件&#xff09;来保证应用的完整性&#xff0c;数字证书和Profile文件可通过申请发布证书和Profile文件获取。   申请数字证书和Profile文件前&#xff0c;首先需要通…

【ES】es介绍

倒排索引&#xff08;Inverted Index&#xff09;和正排索引&#xff08;Forward Index&#xff09; 正排索引是一种以文档为单位的索引结构&#xff0c;它将文档中的每个单词或词组与其所在的文档进行映射关系的建立。正排索引通常用于快速检索指定文档的内容&#xff0c;可以…

一键访问多功能数据解决方案:如何轻松构建和管理APITable智能多维表格

文章目录 前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 前言 vika维格表作为新一代数据生产力平台&#xff0c;是一款面向 API 的智能多维表格。它将复杂的可视化数据库、电子表格、实时在线协同、低代码开发技术四合为一&am…

【JS逆向学习】有道翻译接口参数逆向

逆向目标 目标&#xff1a;有道翻译接口加密参数接口&#xff1a;https://dict.youdao.com/webtranslate加密参数&#xff1a; sign: e3d8fa747713d6957db7cd2eedaa0d95Cookie: OUTFOX_SEARCH_USER_ID696102715114.222.69.137; OUTFOX_SEARCH_USER_ID_NCOO304412380.2597743 …