Typescript中类型兼容的实现

 更新时间:2023年12月29日 09:08:05   作者:新时代的弩力  
在TypeScript 编程中,类型兼容是最基础的一道检查机制,一旦代码中出现类型不兼容的表达式,编译就会失败,本文主要介绍了Typescript中类型兼容的实现,感兴趣的可以了解一下

typscript中的类型兼容是基于结构子类型的(子类型兼容和赋值兼容),即只使用其成员来判定是兼容,这是根据JavaScript的特性设计的,因为js中有很多匿名对象,只要y的所有成员都能在对象x中能找到,那么y=x就能成立,在强类型语言如Java中就不行。

比较对象兼容

比如在一个interface和一个class,只要interface的变量p的成员都能在class或者一个匿名对象中能找到,那么就能把这个class实例或匿名对象赋值给p,如果是对象字面量会触发严格检查操作,需要将对象字面量赋值给一个变量y,再赋值给变量p

interface Named {
    name: string;
}

class Person {
    name: string;
}

let p:Named

p = new Person()
p = {name:'xxxx'}
// 此时会报错 age 不兼容 Named,因为对象字面量会触发严格类型检查,可以通过 as 断言或者 中间变量y
p = {name:'xxxx',age:10}

在这里插入图片描述

函数参数兼容

函数参数也是一样,实参要兼容形参类型

在这里插入图片描述

两个函数兼容性

参数列表数量

判断函数x是否能赋值给函数y,一是从参数数量和参数类型上,函数x参数数量少的,且对应参数类型兼容的能赋值给函数 y

在这里插入图片描述

函数返回值类型,协变

一是从函数的返回值类型上,函数 x 的返回值类型必须是函数 y 的返回值类型的子类,否则报错

在这里插入图片描述

函数参数双向协变(老版本ts)

函数的参数既能赋值父类也能赋值子类

函数参数逆变

当函数 x 的参数是 函数 y 的参数的时,函数 x 也能赋值给 y ,因为函数 y 将来调用时传入的时子类如 Dog 类,那么如果此时用函数 x 替换 函数 y ,相当于函数 x 接收了 Dog 类,而函数 x 的参数类型时 Animal 父类,那么也是兼容的。

interface Animal{
    name:string
}
interface Dog extends Animal{
    bark:()=>void
}

let x = (a:Animal)=>{}
let y = (d:Dog)=>{}

y = x // 函数参数逆变

x = y // 报错

// 因为存在这种情况
function test(fn:(d:Dog)=>void){
    const dog = {name:'dog',bark(){}}

    fn(dog) // 当传入的fn是 (a:Animal)=>void 类型时,Animal类也能接收Dog子类,所以逆变的意义就在于此
}

test(x)

枚举与数字之间的兼容

enum Status { Ready, Waiting };
enum Color { Red, Blue, Green };

let s = Status.Ready;
s = 1 // enum 数字类型兼容
s = Color.Green;  // Error

类和对象字面和接口差不多,主要区别在于类具有静态部分和实例部分,两个类实例对象之间能否赋值不在于其类是否一直,这与Java等语言不同,A 类和 B 类的实例成员只要一致,那么就能相互赋值。但是类的私有成员和受保护成员会影响兼容性,如果目标类型包含一个私有成员,那么源类型必须包含来自同一个类的这个私有成员。 同样地,这条规则也适用于包含受保护成员实例的类型检查。 这允许子类赋值给父类,但是不能赋值给其它有同样类型的类。

class Animal {
    feet: number=0;
    constructor(name: string, numFeet: number) { }
}

class Size {
    feet: number=0;
    constructor(numFeet: number) { }

}

let a: Animal = new Animal('',0)
let s: Size = new Size(0);

a = s;  // OK
s = a;  // OK

泛型

泛型其实对于兼容性的影响在于影响其结果类型,然后在结果类型再去比较类型兼容性
如下,经过泛型推导后的类型是{},那么 x , y 的类型比较就是最终的类型比较

interface Empty<T> {
}
let x: Empty<number>;
let y: Empty<string>;

x = y;  // OK, because y matches structure of x

到此这篇关于Typescript中类型兼容的实现的文章就介绍到这了,更多相关Typescript 类型兼容内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:

相关文章

  • JS实现关闭小广告特效

    JS实现关闭小广告特效

    这篇文章主要为大家详细介绍了JS实现关闭小广告特效,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • JavaScript编写猜拳游戏

    JavaScript编写猜拳游戏

    这篇文章主要为大家详细介绍了JavaScript编写猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • layui 根据后台数据动态创建下拉框并同时默认选中的实例

    layui 根据后台数据动态创建下拉框并同时默认选中的实例

    今天小编就为大家分享一篇layui 根据后台数据动态创建下拉框并同时默认选中的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • 基于insertBefore制作简单的循环插空效果

    基于insertBefore制作简单的循环插空效果

    这是一个基于insertBefore制作简单的循环插空效果,实现的数字下面循环插空效果,给需要的朋友分享。
    2015-09-09
  • js实现拖拽上传图片功能

    js实现拖拽上传图片功能

    这篇文章主要为大家详细介绍了js实现拖拽上传图片功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 微信小程序实现获取手机号60s倒计时

    微信小程序实现获取手机号60s倒计时

    这篇文章主要为大家详细介绍了微信小程序实现获取手机号60s倒计时,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • bootstrap-table formatter 使用vue组件的方法

    bootstrap-table formatter 使用vue组件的方法

    Bootstrap table是国人开发的一款基于 Bootstrap 的 jQuery 表格插件,通过简单的设置,就可以拥有强大的单选、多选、排序、分页,以及编辑、导出、过滤(扩展)等等的功能。这篇文章重点给大家介绍bootstrap-table formatter 使用vue组件的方法,感兴趣的朋友一起看看
    2019-05-05
  • js实现百度联盟中一款不错的图片切换效果完整实例

    js实现百度联盟中一款不错的图片切换效果完整实例

    这篇文章主要介绍了js实现百度联盟中一款不错的图片切换效果的方法,以完整实例形式分析了javascript操作图片切换的技巧,需要的朋友可以参考下
    2015-03-03
  • 详解JS数组Reduce()方法详解及高级技巧

    详解JS数组Reduce()方法详解及高级技巧

    reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素。接下来通过本文给大家分享JS数组Reduce()方法详解及高级技巧,一起看看吧
    2017-08-08
  • 基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片

    基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片

    本文通过php jquery和mysql三者相结合,实现web版在线拍照上传并可在线浏览,下面给大家分享基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片,需要的朋友可以参考下
    2015-09-09

最新评论