type fnType = ((x: number) => void) | ((x: string) => void);
const fn = (innerFn: fnType) => {
innerFn("string");
}
如果我执行上述操作,打字稿会说“‘字符串’类型的参数不可分配给‘从不’类型”。为什么它认为
innerFn
想要一个永不?
你有两台机器。一个切苹果,一个剥橙子。如果您放入错误的水果,两台机器都会发生故障。
现在你制作一个带孔的大黑盒子,用于输入水果。盒子里有人放了苹果切片机或橙子削皮器,但你不知道是哪一个。
现在你怎么知道放入苹果或橙子是否安全?
答案是:你无法知道它是否安全。
在这个类比中,机器是函数,它们接受的水果是参数类型,黑匣子是两者的并集。
这就是函数参数类型是“逆变”的原因(请参阅:https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science))。这意味着当组合成这样的并集时,结果必须满足并集的双方。并且由于
string
和 number
必须键入级别重叠,因此没有类型可以满足这一点。
发生这种情况时,您会得到
never
,这让您知道结果和 永远不存在。