• 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    Activity之间数据回传【Android、activity回传、结合实例】
    二叉树浅见
    给服务器添加本地主机公钥 实现免密登录简单两步
    css 布局出现无法去除的空白
    Vue2 05 计算属性
    007 怎么修改win7电脑系统显示时间
    docker 对容器中的文件进行编辑
    微服务开发与实战Day11 - 微服务面试篇
    简单模拟单/双链表实现 LinkedList作业
    PyTorch深度学习(二)【反向传播、用pytorch实现线性回归】
  • 原文地址:https://blog.csdn.net/qq_42372534/article/details/133785807