此代码
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
这里有类型?
答案 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);
如果通过选择其中一个推理候选项无法形成泛型类型,您将收到您发布的错误。
经验告知了这一选择。在先前版本中(在存在联合类型之前),如果没有推理候选者是所有候选者的超类型,则将推断{}
。在实践中,这导致错误错误的很多,看起来像上面的例子。