TypeScript学习笔记之类型兼容

本文介绍了TypeScript中的类型兼容性,包括协变(允许子类型拥有父类型的属性)和逆变(函数参数中子类型可以替换父类型)。重点讲解了如何通过双向协变在tsconfig中启用这种特性,以及安全性和限制。
摘要由CSDN通过智能技术生成

所谓的类型兼容性,就是用于确定一个类型是否能赋值给其他的类型。typeScript中的类型兼容性是基于结构类型的(也就是形状),如果A要兼容B,那么A至少具有B相同的属性。

协变

举例说明

interface A {
  name:string
  age:number
}

interface B {
  name:string
  age:number
  sex:string
}

let a:A = {
  name:"哈哈",
  age:33,
}

let b:B = {
  name:"呵呵",
  age:33,
  sex:"女"
}

a = b

A B两个类型完全不同,但是竟然可以赋值并无报错,B类型充当A类型的子类型,当子类型里面的属性满足A类型就可以进行赋值,也就是说不能少可以多,这就是协变。

逆变

逆变一般发生于函数的参数上面

举例说明

interface A {
  name:string
  age:number
}

interface B {
  name:string
  age:number
  sex:string
}

let a:A = {
  name:"哈哈",
  age:33,
}

let b:B = {
  name:"呵呵",
  age:33,
  sex:"女"
}

a = b

let fna = (params:A) => {

}
let fnb = (params:B) => {
  
}

fna = fnb //错误

fnb = fna //正确

这里比较绕,注意看fna赋值给fnb,其实最后执行的还是fna,而fnb的类型能够完全覆盖fna ,所以这一定是安全的,相反fna的类型不能完全覆盖fnb,少一个sex,所以是不安全的。

简单总结:多的能赋值给少的,但少的不能赋值给多的

双向协变

tsconfig的strictFunctionTypes设置为false,支持双向协变,fna fnb 随便可以来回赋值、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值