TypeScript 09 类型兼容性

151 阅读2分钟

1 . 类型兼容性基础 :

两种类型系统 :

  • Structure Type System (结构化类型系统)
  • Nominal Type System (标明类型系统)

TS 采用的是 Structure Type System (结构化类型系统),又叫 duck typing(鸭子类型) ,其类型检查关注的是值所具有的形状 。即在结构类型系统中 ,如果两个对象具有相同的形状 ,则认为它们属于同一类型!!!

0419.png

  • Point 和 Point2D是两个不同的类
  • 但是 p 被标注的类型是 Point ,它却是 Point2D 的实例 ,且没有类型错误 。
  • TS 是结构化类型系统 ,检查发现 Point 和 Point2D 结构相同!!!

2 . 对象类型类之间的兼容性 :

对于对象类型来说 ,不是成员完全相同才认为是同一类型 ,如果 对象 X 的成员 >= Y 的成员 ,则说明 Y 兼容 X (即成员少的兼容成员多的) ,且成员多的赋值给成员少的

0420.png

如上图 ,反过来写就不行!!!

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 参数个数 :

参数多的兼容参数少的 (参数少的可以赋值给参数多的)

0421.png

  • 在 JS 中省略用不到的参数很正常 , 这样的使用方式 ,促成了 TS 中函数类型之间的兼容性 。

3 . 2 参数类型 :

1. 参数为原始类型 :

相同位置的参数的类型需相同

2. 参数为对象类型 :

把对象拆开 ,把属性看作一个个参数 ,一个个比较 ,参数少的可以赋值给参数多的 。

3 . 2 返回值类型 :

1. 返回值为原始类型 :

相同位置的返回值的类型需相同

2. 参数为对象类型 :

按照接口类型进行比较 ,成员少的兼容成员多的 ,成员多的赋值给成员少的 !!!