Typescript逆变与协变

刚接触Typescript那会儿有总结过不同类型之间相互赋值的情况:https://www.ccc5.cc/2702.html ,直到最近自己翻官方文档才知道有个更通俗的概念:逆变与协变。中文教程参考这个

假如有三个类有如下关系:

class A{
    a='a'
}

class B extends A{
    b='b'
}

class C extends B{
    c='c'
}

有如下函数:

function test(callback: (arg: B) => B) {
    // ...
}

那么仅有如下类型的函数可以赋值给test函数:

B => B // 这个毋容置疑
A => B // 参数的逆变, 因为test内部会按照符合B类型的方式传参,而B类型赋值给A类型是安全的
B => C // 返回值的协变,因为test内部对于callback的返回值会按照B类型使用,返回B的子类C对于内部使用也是安全的
A => C