1 . 类型兼容性基础 :
两种类型系统 :
- Structure Type System (结构化类型系统)
- Nominal Type System (标明类型系统)
TS 采用的是 Structure Type System (结构化类型系统),又叫 duck typing(鸭子类型) ,其类型检查关注的是值所具有的形状 。即在结构类型系统中 ,如果两个对象具有相同的形状 ,则认为它们属于同一类型!!!
- Point 和 Point2D是两个不同的类
- 但是 p 被标注的类型是 Point ,它却是 Point2D 的实例 ,且没有类型错误 。
- TS 是结构化类型系统 ,检查发现 Point 和 Point2D 结构相同!!!
2 . 对象类型类之间的兼容性 :
对于对象类型来说 ,不是成员完全相同才认为是同一类型 ,如果 对象 X 的成员 >= Y 的成员 ,则说明 Y 兼容 X (即成员少的兼容成员多的) ,且成员多的赋值给成员少的 。
如上图 ,反过来写就不行!!!
2 . 接口之间的兼容性 :
接口之间的兼容性 ,类似于 class ,并且 class 和 interface 之间也可以兼容 。 (还是成员少的兼容成员多的 ,且成员多的赋值给成员少的)
interface Point{ x : number ; y : number }
class Point2D { x : number ; y : number ; z : number }
let p : Point = new Point2D()
3 . 函数之间的兼容性 :
3 . 1 参数个数 :
参数多的兼容参数少的 (参数少的可以赋值给参数多的)
- 在 JS 中省略用不到的参数很正常 , 这样的使用方式 ,促成了 TS 中函数类型之间的兼容性 。
3 . 2 参数类型 :
1. 参数为原始类型 :
相同位置的参数的类型需相同
2. 参数为对象类型 :
把对象拆开 ,把属性看作一个个参数 ,一个个比较 ,参数少的可以赋值给参数多的 。
3 . 2 返回值类型 :
1. 返回值为原始类型 :
相同位置的返回值的类型需相同
2. 参数为对象类型 :
按照接口类型进行比较 ,成员少的兼容成员多的 ,成员多的赋值给成员少的 !!!