刚接触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
1 条回复
[…] * Typescript逆变与协变 * […]