类型兼容性

    ts的类型兼容性是基于结构类型的。 结构类型是一种只使用其成员来描述类型的方式。(大白话:看属性兼容) 
    如果传入的变量A和声明的类型B不匹配,ts会进行兼容性检查
    只要用户传入变量A中的属性>=在源类型B要求的属性,那么认为就是兼容的
  interface INamed {
    name: string
  }
  class Person {
    name: string
  }
  let p = <INamed>{} //按照接口定义一个变量p
  p = new Person()  //p可以去当Person类实例对象 这里也是ts兼容性检查。只要Person类包含name实例就可以赋值给p
  console.log(p);

  let p1 = { name: ‘Alice‘, age: 10 }
  p = p1  //这也是ts兼容性检查 只要p1对象里面又name属性就可以赋值给P

 

接口兼容性

//接口的兼容性
  interface Animal {
    name: string
    age: number
  }
  interface Person {
    name: string
    age: number
    gender: string
  }
  interface IGetNameFunc {
    (animal: Animal): string //注意这里要求传入的是Animal类型对象
  }
  const getName: IGetNameFunc = animal => animal.name
 
  const p: Person = { name: ‘zs‘, age: 12, gender: ‘male‘ }
  const dog0: Animal=p //Animal实例居然可以等于p实例对象 这个也是ts兼容性检查
  const dog: Animal = { name: ‘xiaoHui‘, age: 1 }

  getName(dog) //传入Animal实例对象dog是很正常的
  getName(p) //传入Person实例对象p居然也是可以的。这里就是ts兼容性检查 只要p包含name、age属性就是可以的

 

 类的兼容性

 // 类的兼容性 

  class Animal {
    name: string
  }
  class Bird extends Animal {
    fly(): void { }
  }
  const a:Animal=new Animal() //这是很正常的
  const b:Animal=new Bird() //父变量引用子实例对象 这其实也是ts兼容性检查
  // const c:Bird=new Animal() // ERROR Bird要求有name/fly属性。但是右边的Animal只有name属性 所以报错
  const d:Animal={name:‘zs‘} //甚至这个也是ts兼容性检查

 

类型兼容性

上一篇:grep保留标题的方法


下一篇:EasyCode插件代码生成模板