类型兼容性
1. 介绍
TypeScript 里的类型兼容性是基于结构子类型的,它与名义类型形成对比。
即结构子类型只要求组成结构一致,而不需要完全的名称相同。
interface Named {
name: string;
}
class Person {
name: string;
}
let p: Named;
p = new Person(); // 不会报错因为 Named 类型和 Person 类型的结构{ name: string }是一致的,但是在基于名义类型的语言中,如 C# 或 Java 中,这段代码会报错,因为 Person 类没有明确说明其实现了 Named 接口。
1.1 对象兼容
如果 x 要兼容 y,那么 y 至少具有与 x 相同的属性
interface Named {
name: string;
}
let x: Named;
let y = { name:'Alice', location: 'Seattle'};
x = y;将 y 赋值给 x,目标为 x,此时就会检验,是否 x 中的每个属性,在 y 中都可以找到。只要都能找到,那么赋值就是允许的。
检验函数参数也是同样的
这个属性查找的过程是递归的,检查每个成员及子成员。
1.2 函数兼容
1.2.1 参数兼容
为什么会允许,将少参数的函数赋值给多参数的函数呢?
因为在JS中忽略额外的参数是很常见的,如 Array#forEach, 三个参数为元素,索引和整个数组:
1.2.2 返回值兼容
2. 枚举之间的兼容性
枚举类型与数字类型兼容,数字类型与枚举类型兼容. 但是枚举类型之间是不兼容的。
3. 类
类与对象字面量和接口差不多,除了:类有静态部分和实例部分的类型。
比较两个类类型的对象时,只有实例成员会被比较,静态成员和构造函数不在比较范围内。
4. 泛型
类型参数只影响使用其作为类型一部分的结果类型:
Last updated
Was this helpful?