类型兼容
协变
typescript
// A和B 可以称为鸭子类型
// 主类型
interface A {
name: string
age: number
}
// 子类型
interface B {
name: string
age: number
sex: string
}
let a: A = {
name: '老墨我想吃鱼了',
age: 33,
}
let b: B = {
name: "高启强",
age: 33,
sex: "男"
}
// 只要B中的类型完全覆盖A中的类型,就可以进行赋值,只能多不能少
// 就称为类型兼容性的协变
a = b
逆变
typescript
let fna = (params: A) => {
}
let fnb = (params: B) => {
}
// 在strict模式下,fna报错
// 类型 "A" 中缺少属性 "sex",但类型 "B" 中需要该属性
// 原因为fnb赋值给fna,最终调用的还是fnb,所以fnb不能缺少属性
fna = fnb
// 但这种情况又可以,得出结论函数参数上是一个逆变
fnb = fna
不过在typescript2.0之前支持fna = fnb,可以在tsconfig.json中将"strictFunctionTypes"设置为false,也称为双向协变。