所谓的类型兼容性,就是用于确定一个类型是否能赋值给其他的类型。typeScript中的类型兼容性是基于结构类型的(也就是形状),如果A要兼容B,那么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:"女"
}
a = b
A B两个类型完全不同,但是竟然可以赋值并无报错,B类型充当A类型的子类型,当子类型里面的属性满足A类型就可以进行赋值,也就是说不能少可以多,这就是协变。
逆变
逆变一般发生于函数的参数上面
举例说明
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:"女"
}
a = b
let fna = (params:A) => {
}
let fnb = (params:B) => {
}
fna = fnb //错误
fnb = fna //正确
这里比较绕,注意看fna赋值给fnb,其实最后执行的还是fna,而fnb的类型能够完全覆盖fna ,所以这一定是安全的,相反fna的类型不能完全覆盖fnb,少一个sex,所以是不安全的。
简单总结:多的能赋值给少的,但少的不能赋值给多的
双向协变
tsconfig的strictFunctionTypes设置为false,支持双向协变,fna fnb 随便可以来回赋值、