type parent = string | boolean | number type child = string | boolean type test1 = child extends parent ? true : false// true type test2 = parent extends child ? true : false// false
interfacePerson { name: string age: number }
interfaceSun { name: string age: number class: string } type test3 = SunextendsPerson ? true : false// true type test4 = PersonextendsSun ? true : false// false
可以看出 child 是 parent 的子类型, 比parent 更加具体;
同样 Sun 是 Person 的子类型, 比Person多了个属性, 比Person 更加具体;
协变
什么是协变: 子类型可以赋值给父类型就叫做协变
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
letp1:Person = { name: 'jack', age: 56 }
lets1:Sun = { name: 'tom', age: 12, class: 'c1' }
p1 = s1 s1 = p1 // roperty 'class' is missing in type 'Person' but required in type 'Sun'. console.log(p1.class) // Property 'class' does not exist on type 'Person'
在这个例子中 Sun 类型比 Person 类型多了一个class 属性,Sun 中其他属性跟 Person 一样, 所以可认为 Sun 是 Person 的子类型;
并且 p1 是 Person 类型, s1 是 Sun 类型, s1 可以赋值给 p1, 但 p1 不能赋值给 s1;