TS的类型兼容性

2,713 阅读2分钟

前言

⭐️本节我们来看看关于TS的类型兼容性

什么是类型兼容性

先来聊聊什么是类型兼容性吧🍵

第一次接触可能不能一下理解,没关系!我们通过一个例子🌰来解释吧

如下:

interface Named {
    name: string;
}
class Person {
    name: string;
}
let p: Named;

p = new Person();

上述例子,定义了一个接口Named、一个Person类以及一个类型为Namedp变量,最后p却赋值为了new Person。这如果放在C#Java中,这段代码会报错,因为Person类没有明确说明其实现了Named接口。注意在TS中,这是不会报错的。

像这样定义为接口类型的,可以时类产生的对象,这就叫兼容,不知道大家是否能感觉得到。

基于结构类型

那为什么会这样呢?或者说TS的这种类型兼容性基于什么呢

事实上,TS里的类型兼容性是基于结构子类型的

TS的结构性子类型是根据JS代码的典型写法来设计的,因为JS里广泛地使用匿名对象,例如函数表达式和对象字面量,所以使用结构类型系统来描述这些类型比像C#Java使用名义类型系统更合适一些

另外,TS结构化类型系统的基本规则是,如果x要兼容y,那么y至少具有与x相同的属性

例如官方给的这个例子🌰:

interface Named {
    name: string;
}

let x: Named;
// y's inferred type is { name: string; location: string; }
let y = { name: 'Alice', location: 'Seattle' };
x = y;

如上代码,对于TS来说,它需要检查y是否能赋值给x,它会检查x中的每个属性,然后去看y是否有对应的属性,如果有就能赋值,否则不能

注意:比较过程是递归进行的,检查每个成员及子成员

END

以上就是本文的所有内容,如有问题,欢迎指正~