码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • typscript中逆变与协变


    父类型与子类型

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

    父类型子类型
    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
  • 相关阅读:
    实现Object.create()
    IntelliJ IDEA
    【深度学习】目标检测,Faster-RCNN算法训练,使用mmdetection训练
    gradle java: 程序包org.apache.shiro不存在
    js读取文件的内置方法之 FileReader
    R语言地理加权回归、主成份分析、判别分析等空间异质性数据分析
    MyBatis操作数据库的方式(api+注解)
    js设计模式:适配器模式
    【2024秋招】小米中间件后端开发一面2023-9-13-base武汉
    Java零基础入门-算术运算符
  • 原文地址:https://blog.csdn.net/qq_42372534/article/details/133785807
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号