Typescript – 怎么理解协变和逆变

Typescript - 怎么理解协变和逆变

首先协变(Covariance)和逆变(contravariance),这俩概念不是TS特有的,很多有类型系统的语言都有一样的概念,比如C#,JAVA等。要理解这两个概念,让我们先建立几个类,然后再详细说明,如下:

代码很直观,建立了3个类,动物,狗,黄狗,它们之间的继承关系是,动物(Animal)类是基类,狗(Dog)继承自动物类,黄狗(YellowDog)继承自狗类。Animal <- Dog <- YellowDog 它们每个类都有各自特有的属性

接下来,我们来为每个类创建一个实例对象

协变(Covariance)

根据微软的解释:协变是使您能够使用比最初指定更多的派生类型。这是什么意思?其实就是指,派生类型的值可以安全的赋给基类型(继承自的类型),而反过来就不行。

比如本例中,黄狗的实例,就可以赋值给类型为狗或动物的变量,狗的实例可以赋值给动物类型的变量,但反过来,狗的实例,就不可以赋值给黄狗类型的变量,如下:

我觉得这也可以理解,因为这样的赋值是安全的。属性多的实例,赋值给属性少的类型,不会丢失数据。黄狗类包含了动物类所有的成员,所以当黄狗对象赋值给动物类型时,动物类型的每个字段属性都可以被正常赋值,如果反过来,用动物实例对象给黄狗类型赋值,那动物对象中就不存在黄狗对象所需要的字段,视为不安全赋值,所以编译报错。

逆变(contravariance)

也是根据微软的解释:跟协变正好相反,逆变使您能够使用比最初指定的更通用(较少派生)的类型。

这通常发生在函数类型的参数中,看下面的代码:

我们定义了三个函数类型,然后为每个函数类型定义了一个函数的实例。

接下来,我们定义了一个函数,它的参数是一个FuncDog的函数类型。让我们看看把每个函数传进来会有什么结果,

现在反而是 funYellowDog 参数报错了,因为它是继承自Dog,跟协变相反,所以它会报错。那要怎么理解这个呢?为啥会这样,我是这么理解的,

让我们改一下这个函数,让它做点事:

因为传入的函数参数终究还是要被调用的,按理它是需要一个狗的对象,所以我们实例化一个dog对象,然后调用 func(dog) ,这时如果使用 FuncAnimal 类型的函数,没有问题,因为它需要的参数是 Animal 类型,所以dog可以赋值给它。正好又符合了协变。

但如果这里允许传入 FuncYellowDog 类型的函数,那当它调用的时候,dog就想当于要赋值给 YellowDog 类型的变量,这就又是不安全的赋值。跟协变里面的错误是一样的。所以就禁止这样做了。

总结

这里有点饶啊,最好大家可以自己上手试试,我觉得可以想明白的。感谢阅读,发现错误请指正。

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年8月18日
下一篇 2022年8月18日

相关推荐

  • R语言学习 – 基础概念和矩阵操作

    R基本语法 获取帮助文档,查看命令或函数的使用方法、事例或适用范围 >>> ?command>>> ??command #深度搜索或模糊搜索此命…

    2022年6月24日
  • SpringBoot整合Mybatisplus

    Mybatis-Plus 实战教程 1.什么是Mybatis-Plus 1.1 什么是mybatis-plus 官网:www.mybatis-plus.com/guide/ MyB…

    2022年6月17日
  • 化学线索揭示恐龙新陈代谢率高低

    在《自然》杂志的一篇新论文中,美国科学家揭示了一种研究恐龙新陈代谢率的新方法,该方法利用恐龙骨骼中的线索表明个体动物在其生命的最后一个小时内呼吸量。研究以此证实,大多数恐龙都是温血…

    2022年8月16日
  • 投资需要更多的是坚持与复利

    投资中需要的,是坚持与复利!大盘一路调整下来,我坚持看好的板块,在下跌中我一直加仓,但时刻保持你手中有资金,在恐慌中保持理性加仓(巴菲特曾经说过)。 其实复利是最有魔力的,为什么巴…

    2022年8月3日
  • 萌动可爱、妖里妖气等创意IP,如何助力乡村旅游冲破同质化束缚?

    在我国乡村游迅速崛起的背景下,同质化现象频出,而破局的关键依旧是在运营。 近日,天津、湖北恩施连续发生两起“步步惊心”项目游客坠落事故,从“步步惊心”到“步步惊魂”,不禁让人唏嘘,…

    2022年8月13日
  • Matlab基础入门手册(第六章 符号运算)

    第六章 符号运算 1.53 符号对象 1.符号数值、变量和表达式的创建方法 2.认识函数 sym、syms 3.说明 符号数学工具箱 符号数学工具箱引入了一种特殊的数据类型 &#8…

    2022年6月19日
  • 美媒:特斯拉裁员对象包括仅入职数周的员工

    据彭博6月24日报道,在特斯拉近期的全球裁员计划中,包括刚录用不久的员工。据报道,部分前特斯拉员工在LinkedIn上分享了他们刚录用不久就被解雇的经历。其中有人表示,在特斯拉工作…

    2022年6月28日
  • go并发编程

    协程(Goroutines) 在Go语言中,每一个并发的执行单元叫作一个goroutine。,我们只需要通过 go 关键字来开启 goroutine 即可。goroutine 是轻…

    2022年6月21日
  • 用了这个工具后,再也不写 getter、setter 了

    作者:DrLauPen 链接:https://juejin.cn/post/7103135968256851976 前言 相信绝大多数的业务开发同学,日常的工作都离不开写 gett…

    2022年6月18日
  • 一个午睡打呼噜都能监测的智能手环,天花板存在了哦

    说正题,手环和手表的区别是什么?大家认知里是不是手环属于小,细那种,例如小米的手环,手表就是大屏的 圆屏那种,其实我们区别为健康类型,商务类型,和运动类型。健康类型就是监测健康数据…

    2022年7月24日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息