TS的类型兼容性⭐️本节我们来看看关于TS的类型兼容性 什么是类型兼容性 先来聊聊什么是类型兼容性吧🍵 第一次接触可能
前言
⭐️本节我们来看看关于TS
的类型兼容性
什么是类型兼容性
先来聊聊什么是类型兼容性吧🍵
第一次接触可能不能一下理解,没关系!我们通过一个例子🌰来解释吧
如下:
interface Named {
name: string;
}
class Person {
name: string;
}
let p: Named;
p = new Person();
上述例子,定义了一个接口Named
、一个Person
类以及一个类型为Named
的p
变量,最后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
以上就是本文的所有内容,如有问题,欢迎指正~
转载自:https://juejin.cn/post/7029201656973623327