TypeScript 似乎在推断类型保护的联合类型方面存在问题。作为示例,考虑一个将类型保护数组与以下签名组合起来的函数
function combine<T>(guards: ((x: any) => x is T)[]): (x: any) => x is T
并考虑以下类型防护A
and 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
, 意思是T
被推断为A
而不是A | B
.
指定时T
明确地,即combine<A|B>([isA, isB])
,它按预期工作。有没有办法改变签名combine
这样就可以推断出这一点?
您可以使用类型参数来表示整个函数,而不仅仅是受保护的类型。这允许编译器推断保护函数的联合。然后我们可以使用条件类型来提取受保护类型的并集:
type GuardType<T> = T extends (o: any) => o is infer U ? U : never
class A { q: any }
class B { p: any }
declare function isA(x: any): x is A
declare function isB(x: any): x is B
declare function combine<T extends ((x: any) => x is any)>(guards: T[]): (x: any) => x is GuardType<T>
let isAB = combine([isA, isB]); // (x:any) => x is A|B
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)