型別相容性
阿新 • • 發佈:2021-07-07
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相容性檢查