协变:只要B中的属性可以覆盖A的所有属性(B类型只能比A类型多,不能比A类型少)
interface A {
name: string;
age: number;
}
interface B {
name: string;
age: number;
sex: string;
}
let a: A = {
name: "张安",
age: 10,
};
let b: B = {
name: "李四",
age: 20,
sex: "男",
};
a = b; //不会报错,这就是协变,只要B中的属性可以覆盖A的所有属性(B类型只能比A类型多,不能比A类型少)
逆变:函数,在tsconfig.json中"strictFunctionTypes": true时,把"strictFunctionTypes"设置为false就支持双向协变
interface A {
name: string;
age: number;
}
interface B {
name: string;
age: number;
sex: string;
}
let fna = (params: A) => {};
let fnb = (params: B) => {};
fna = fnb; //不能将类型“(params: B) => void”分配给类型“(params: A) => void”。参数“params”和“params” 的类型不兼容。 类型 "A" 中缺少属性 "sex",但类型 "B" 中需要该属性
fnb = fna; //可以