Skip to content

类型兼容

协变

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,也称为双向协变

Released under the MIT License.