为什么采用不兼容参数类型的函数类型的联合被认为等同于采用“从不”的函数?

问题描述 投票:0回答:1
type fnType = ((x: number) => void) | ((x: string) => void);

const fn = (innerFn: fnType) => {
    innerFn("string");
}

如果我执行上述操作,打字稿会说“‘字符串’类型的参数不可分配给‘从不’类型”。为什么它认为

innerFn
想要一个永不?

typescript contravariance
1个回答
0
投票

你有两台机器。一个切苹果,一个剥橙子。如果您放入错误的水果,两台机器都会发生故障。

现在你制作一个带孔的大黑盒子,用于输入水果。盒子里有人放了苹果切片机或橙子削皮器,但你不知道是哪一个。

现在你怎么知道放入苹果或橙子是否安全?

答案是:你无法知道它是否安全。


在这个类比中,机器是函数,它们接受的水果是参数类型,黑匣子是两者的并集。

这就是函数参数类型是“逆变”的原因(请参阅:https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science))。这意味着当组合成这样的并集时,结果必须满足并集的双方。并且由于

string
number
必须键入级别重叠,因此没有类型可以满足这一点。

发生这种情况时,您会得到

never
,这让您知道结果和 永远不存在。

© www.soinside.com 2019 - 2024. All rights reserved.