【发布时间】:2019-02-13 16:07:57
【问题描述】:
TypeScript 似乎无法推断类型保护的联合类型。例如,考虑一个将类型保护数组与以下签名组合的函数
function combine<T>(guards: ((x: any) => x is T)[]): (x: any) => x is T
并考虑以下具有不同属性的 A 和 B 类型保护
function isA(x: any): x is A
function isB(x: any): x is B
现在我希望combine([isA, isB]) 能够工作并具有推断类型(x: any) => x is A | B,但是我收到一个错误消息,指出((x: any) => x is A | (x: any) => x is B)[] 类型的参数不能分配给(x: any) => x is A 类型的参数,这意味着@987654329 @ 被推断为A 而不是A | B。
当明确指定T 时,即combine<A|B>([isA, isB]),它按预期工作。有没有办法更改combine 的签名以便可以推断出这一点?
【问题讨论】:
-
你总是可以使用
function combine2<T, U>(guards: [((x: any) => x is T), ((x: any) => x is U)]): (x: any) => x is T | U,但我猜你想接受一个包含不同数量项目的数组? -
没错,我正在寻找一种适用于任何(正数)数组元素的解决方案。
标签: typescript