类的兼容性

  1. class Point {x:number ; y:number}
  2. class Point2D{x:number ; y:number}
  3. const p:Point = new Point2D()
  4. //不会报错

解释:
1.Point和Point2D是两个不同的类。
2.变量p的类型被标注为Point类型,但是它的值却是Point2D的实例,并且没有类型错误。
3.因为TS是结构化类型系统,值检查Point和Point2D的结构是否相同(即x与y两个属性是否相同)
注意:
在Nominal Type System中(比如c#,java等)它们是不同的,类型无法兼容

成员多的可以赋值给少的

  1. class Point {x:number ; y:number}
  2. class Point3D{x:number ; y:number ; z:number}
  3. const p:Point = new Point3D()
  4. //不会报错

接口兼容性

类和接口也是兼容的

  1. interface Point {x:number ; y:number}
  2. interface Point3D{x:number ; y:number}
  3. class Point4D{
  4. x:number
  5. y:number
  6. z:number
  7. r:number
  8. }
  9. let p1: Point
  10. let p2: Point2D = P1 //不会报错
  11. interface Point3D{x:number ; y:number ; z:number}
  12. let p3:Point3D
  13. p2 = p3 //不会报错
  14. p2 = new Point4D() //不会报错

函数兼容性

函数兼容性需要考虑3点

1.参数个数

参数少的可以赋值给参数多的

  1. type f1 = (a:number)=>void
  2. type f2 = (a:number, b:number)=>void
  3. let F1:f1
  4. let F2:f2 = F1
  1. //forEach方法的第一个参数时回调函数,该类型为:
  2. //(value:string,index:number,array:string[])=>void
  3. const arr = ['a','b','c']
  4. arr.forEach(()=>{})
  5. arr.forEach((item)=>{})

2.参数类型

相同位置的参数类型要相同或兼容

  1. //type为类型别名
  2. type f1 = (a:number)=>void
  3. type f2 = (a:string)=>void
  4. let F1:f1
  5. let F2:f2 = F1 //err:不能将number类型赋值string
  1. interface Point2D{x:number ; y:number}
  2. interface Point3D{x:number ; y:number ; z:number}
  3. type F2 = (p:Point2D)=>void
  4. type F3 = (p:Point3D)=>void
  5. let f2:F2
  6. let f3:F3 =f2
  7. f3=f2 //不报错
  8. f2=f3 //err:不兼容

注意:
1.这与前面的接口兼容性冲突
2.可以理解为接口使用type引用后每个属性变成了一个参数,因而参数少的可以赋值给参数多的

3.返回值类型

只关注返回值类型本身就可以

  1. //返回值类型相同可以兼容
  2. type F5 = ()=>string
  3. type F6 = ()=>string
  4. let f5:F5
  5. let f6:F6 = f5
  6. //返回值类型为对象时,遵循类的兼容条件
  7. //即成员多的可以赋值给成员少的
  8. type F7 =()=>{name:string}
  9. type F8 =()=>{name:string; age:number}
  10. let f7:F7
  11. let f8:F8
  12. f7=f8