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

TypeScript泛型:子层级泛型类型推导问题

问题描述

我正在处理多泛型类型场景,希望能在方法调用层面自动推导这些类型。现有代码如下:

class AbstractModal<TInput, TOutput> {
    // ... 类实现
}

type Constructor<T> = new(...args: any[]) => T;

function openModal<TConstructor extends Constructor<AbstractModal<?, ?>>>(
    ctor: TConstructor,
    initialState?: TInput // 这里需要对应AbstractModal的TInput类型
): TOutput { // 这里需要对应AbstractModal的TOutput类型
    // ... 方法实现
}

我期望定义如下子类:

class TestModalType extends AbstractModal<string /*或其他类型*/, number /*或其他类型*/> {
    // ... 类实现
}

调用openModal并传入TestModalType时,编译器能对不合法的初始输入进行报错提示。我查阅过一些针对单泛型参数的TypeScript类型推导方案,但它们不适用于我这种多泛型参数的复杂场景。

解决方案

要实现多泛型参数的自动推导,需要利用TypeScript的**条件类型推断(Infer)**从构造函数类型中提取AbstractModal的TInput和TOutput。修改后的代码如下:

class AbstractModal<TInput, TOutput> {
    // ... 类实现
}

type Constructor<T> = new(...args: any[]) => T;

// 从构造函数类型中提取AbstractModal的泛型参数
type ModalFromConstructor<T> = T extends Constructor<AbstractModal<infer TInput, infer TOutput>> 
    ? { Input: TInput; Output: TOutput } 
    : never;

function openModal<TConstructor extends Constructor<AbstractModal<any, any>>>(
    ctor: TConstructor,
    initialState?: ModalFromConstructor<TConstructor>['Input']
): ModalFromConstructor<TConstructor>['Output'] {
    // 示例实现:创建实例并返回结果
    const modal = new ctor();
    // 假设modal有open方法返回TOutput
    return modal.open(initialState);
}

// 测试用例
class TestModalType extends AbstractModal<string, number> {
    open(initialState?: string): number {
        return initialState ? initialState.length : 0;
    }
}

// 合法调用:initialState是string类型,返回number类型
const result = openModal(TestModalType, "hello");
console.log(result); // 输出5

// 非法调用:传入number类型,编译器会报错
const invalidResult = openModal(TestModalType, 123);

关键说明

  • 使用infer关键字在条件类型中,从TConstructor对应的AbstractModal实例类型里推导出TInput和TOutput。
  • ModalFromConstructor类型专门负责提取构造函数对应的模态框泛型参数,让openModal的参数和返回值类型能自动关联到传入的具体模态类。
  • 调用时,TypeScript会自动根据传入的TestModalType推导出initialState必须是string类型,返回值是number类型,非法输入会直接触发编译报错。

内容的提问来源于stack exchange,提问作者Duncan McPherson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:44:53