如何推断TypeScript泛型的嵌套泛型类型?
问题描述
我定义了一个Expression接口,它通过OperatorExpression形成无限嵌套结构。当前传入的泛型本身带有泛型参数,希望能自动推断该嵌套泛型类型。
现有接口定义如下:
type Expression<T, U = string> = (T extends Approval<U> ? Approval<U> : Condition<U>) | OperatorExpression<T, U> interface OperatorExpression<U, T = string> { operands: Expression<T, U>[] // other stuff } interface Approval<T = string> { approver: T // other stuff } interface Condition<T = string> { id: T // other stuff }
当使用非string类型的嵌套泛型时,必须这样调用:
Expression<Approval<Types.ObjectId>, Types.ObjectId>
我希望简化为Expression<Approval<Types.ObjectId>>,即根据第一个泛型的嵌套泛型自动推断第二个泛型参数。
我尝试了如下写法,但因“S不存在”报错:
type Expression<T extends (Approval<S> | Condition<S>), U = S> = (T extends Approval<U> ? Approval<U> : Condition<U>) | OperatorExpression<T, U>
请问该如何实现?
解决方案
通过定义类型推断工具InferType,自动从Approval或WorkflowCondition中提取嵌套的泛型类型,再将其作为Expression第二个泛型参数的默认值,即可实现自动推断。适配业务场景的实现代码如下:
type InferType<T> = T extends Approval<infer E> | WorkflowCondition<infer E> ? E : never; type R<T> = InferType<T> export type Expression<T, U = R<T>> = | (T extends Approval<U> ? Approval<U> : T extends WorkflowCondition<U> ? WorkflowCondition<U> : WorkflowApproval<U>) | OperatorExpression<T, U>
内容的提问来源于stack exchange,提问作者Kreshel
相关产品推荐
相关产品推荐

