推断 TypeScript 中类型保护的联合类型

2023-12-02

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(使用前将#替换为@)

推断 TypeScript 中类型保护的联合类型 的相关文章

随机推荐