1. 程式人生 > 其它 >型別相容性

型別相容性

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相容性檢查