typescript 类型兼容

28 阅读1分钟

协变:只要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; //可以