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

2024-06-06

这段代码

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

导致这个错误:

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

为什么不能是U简单地推断出具有类型string | number here?


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

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

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

经验告诉我们这个选择。在之前的版本中(在联合类型存在之前),{}如果没有推理候选者是所有候选者的超类型,则将被推断。在实践中,这导致了lot类似于上面示例的遗漏错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么类型参数不被推断为联合类型? 的相关文章

随机推荐