typscript中逆变与协变

父类型与子类型

一般,B类型继承或者拓展了A类型,那么A是父类型,B是子类型.
特别地,联合类型对于其中的某个类型来说是父类型,如string|number是父类型,stringnumber都是子类型
变量赋值中,一般子类型可以赋值给父类型.

父类型子类型
AnimalDog
string|numberstring

协变与逆变

这两个概念针对函数的类型,包含了函数的参数类型返回值类型
函数赋值,要么就是参数类型和

协变

协变是与函数返回值类型相关.
有两个函数类型A,B,如果B函数的返回值类型可以是A函数类型的返回值类型的子类,那么B类型变量就可以赋值给A类型变量

逆变

逆变是与函数参数类型相关
有两个函数类型A,B,如果B函数的参数类型可以是A函数类型的参数类型的父类,那么B类型变量就可以赋值给A类型变量,如果弄反了则会报错.
其实在函数类型中核心还是子类型可以赋值给父类型,但是父类型不能赋值给子类型,某个变量是函数类型,其参数类型限定为T,返回值限定为R,那么能够赋值给这个变量的值的类型必须满足参数类型必须是T或者T的父类,返回值类型为R或者R的子类,从直觉上看,参数类型可以是父类(逆变),返回值类型可以是子类(协变),

interface Animal {
  name: string
}
interface Dog extends Animal {
  breed: string
}
const dog: Dog = { name: 'xxx', breed: 'yyy' }

function setName(animal: Animal, name: string) {
  animal.name = name
}

function getDogName(): Dog {
  return dog
}
// 逆变,setName的参数是Animal,setDogName的参数类型是Dog,setName可以赋值给setDogName
const setDogName: (dog: Dog, name: string) => void = setName

// 协变,getDogName的返回类型是Dog,getName的返回类型是Animal,Dog是Animal的子类
const getName: () => Animal = getDogName
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值