为什么不将类型参数推断为联合类型?

时间:2016-10-06 20:58:57

标签: typescript typescript-generics

此代码

declare function fn<T, U>(array: T[], predicates: ((arg: T) => U)[]): [T, U];
let a = fn([1, 2, 3], [x => 2, x => 's']);

导致此错误:

  

类型参数的类型参数&#39; U&#39;无法从中推断出来   用法。考虑明确指定类型参数。类型   论证候选人&#39;数字&#39;不是有效的类型参数,因为它是   不是候选人的超类型&#39;字符串&#39;。 function fn(array:T [],   谓词:((arg:T)=&gt; U)[]):[T,U]

为什么U只能推断为string | number这里有类型?

1 个答案:

答案 0 :(得分:6)

TypeScript通常不会在通用推理期间合成联合类型。简单来说,原因是这样的推理是不可取的:

function compare<T>(x: T, y: T): number { ... }
// Could infer T: string | number here... but that'd be bad
compare('oops', 42);

如果通过选择其中一个推理候选项无法形成泛型类型,您将收到您发布的错误。

经验告知了这一选择。在先前版本中(在存在联合类型之前),如果没有推理候选者是所有候选者的超类型,则将推断{}。在实践中,这导致错误错误的很多,看起来像上面的例子。