4

这段代码

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

导致此错误:

无法从用法中推断类型参数“U”的类型参数。考虑明确指定类型参数。类型参数候选“数字”不是有效的类型参数,因为它不是候选“字符串”的超类型。函数 fn(array: T[], 谓词: ((arg: T) => U)[]): [T, U]

为什么不能U简单地推断出string | number这里的类型?

4

1 回答 1

7

TypeScript 通常不会在泛型推理期间合成联合类型。简而言之,原因是不希望进行这样的推理:

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

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

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

于 2016-10-06T21:14:19.520 回答