最近在学习Typescript 中的泛型概念,有个问题就是“为什么函数的参数会逆变?”,我知道:
Covariance
是如果T extends U
(T
可分配给),则(也可分配给)U
为真G<T> extends G<U>
G<T>
G<U>
Contravariance
是如果T extends U
,那就一定会得出结论G<U> extends G<T>
(现在G<U>
可以分配给G<T>
)。
在该论坛提问之前,我阅读了以下帖子,但是,我仍然无法理解为什么 Typescript 中的函数在其参数中是逆变的:
我发现不仅 TypeScript 中的函数与其参数是逆变的,而且其他一些语言也是如此。
我很沮丧,因为我没有弄清楚为什么这是事实,就接受了它。你能帮我解释一下吗?如果我缺少相关知识,请告诉我是什么。
Animal
我将使用和的具体例子Dog
。Dog
允许和之间分配有两种选择Animal
,我们可以替换吗Dog
,Animal
以及我们是否可以Animal
替换Dog
。因为这
extends
意味着我们有基础的成员,这没问题。Typescript 允许这样做bark
中没有方法Animal
,因此运行时会失败。Typescript 禁止这样做。现在让我们看一下函数类型。
语言设计者对函数参数的选择也是一样的。让我们看看当我们允许这两种情况时会发生什么
因为我们正在
Dog
向useAnimal
它传递一个,所以它可以move(10)
像上面一样。Typescript 允许这样做。我们
Animal
传递给的useDog
会导致运行时失败,因为它缺少bark()
。 Typescript 禁止这样做。