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
相关产品推荐
相关产品推荐

