You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何推断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 15:54:18