Skip to content

类型兼容

所谓的类型兼容性,就是用于确定一个类型是否能赋值给其他的类型。typeScript中的类型兼容性是基于结构类型的(也就是形状),如果A要兼容B 那么A至少具有B相同的属性。

协变

也可以叫鸭子类型

ts
interface A {
  name: string,
  age: number
}

interface B {
  name: string,
  age: number,
  sex: string
}

let a: A = {
  name: 'GG',
  age: 20
}
let b: B = {
  name: 'gg',
  age: 20,
  sex: '女'
}

// b对象中的值包含了a对象中的值,所以可以复制给a
a = b
console.log(a)

A B 两个类型完全不同但是竟然可以赋值并无报错B类型充当A类型的子类型,当子类型里面的属性满足A类型就可以进行赋值,也就是说不能少可以多,这就是协变。

逆变

ts
interface A {
  name: string
  age: number
}

interface B {
  name: string
  age: number
  sex: string
}


let fna = (params: A) => {

}
let fnb = (params: B) => {

}

fna = fnb //错误

fnb = fna //正确

这里比较绕,注意看fna 赋值 给 fnb 其实最后执行的还是fna 而 fnb的类型能够完全覆盖fna 所以这一定是安全的,相反fna的类型不能完全覆盖fnb少一个sex所以是不安全的。

双向协变

tsconfig.json中将 strictFunctionTypes 设置为 false 支持双向协变 函数 fna 和函数 fnb 随便可以来回赋值