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

TypeScript嵌套构造函数中泛型类型自动推断问题

TypeScript泛型推断问题:OrValidator无法继承父Processor的泛型参数

问题场景

实现泛型Processor类,依赖泛型Validator和Executor完成数据校验与处理,常规场景下泛型参数可从Processor自动推断。但引入接收子Validator的OrValidator后,子Validator的泛型类型丢失:

  • NumberProcessor继承自Processor<[number, number, number], number>
  • OrValidator内部的子Validator被推断为仅接收单个参数,导致类型报错
  • 手动指定嵌套项泛型可正常运行,期望OrValidator能自动继承NumberProcessor的泛型参数

问题原因

核心问题在于OrValidator的泛型定义未与Processor的输入元组类型建立强关联。默认情况下,OrValidator的泛型可能仅约束了单个输入类型,而非Processor所需的元组类型,导致TypeScript无法自动推导子Validator需要匹配的完整参数签名。

解决方案

1. 调整OrValidator的泛型约束

让OrValidator的泛型参数直接继承Processor的输入元组类型,确保子Validator的参数签名与父Processor一致:

// 定义Validator接口时明确接收元组输入
interface Validator<I extends any[], O> {
  validate(...args: I): O;
}

// OrValidator泛型直接绑定到元组输入I和输出O
class OrValidator<I extends any[], O> implements Validator<I, O> {
  constructor(private validators: Validator<I, O>[]) {}

  validate(...args: I): O {
    // 实现校验逻辑,示例:遍历子Validator直到通过
    for (const validator of this.validators) {
      try {
        return validator.validate(...args);
      } catch (e) {
        continue;
      }
    }
    throw new Error("All validators failed");
  }
}

2. 强化Processor的泛型约束

在Processor的构造函数中,明确要求传入的Validator必须严格匹配当前Processor的输入元组I和输出O:

interface Executor<I extends any[], O> {
  execute(...args: I): O;
}

class Processor<I extends any[], O> {
  constructor(public validator: Validator<I, O>, public executor: Executor<I, O>) {}

  process(...args: I): O {
    this.validator.validate(...args);
    return this.executor.execute(...args);
  }
}

// 继承Processor时自动传递泛型参数
class NumberProcessor extends Processor<[number, number, number], number> {
  constructor() {
    // OrValidator现在会自动继承[number, number, number]的元组类型
    super(
      new OrValidator([
        // 子Validator会被自动推断为接收3个number参数
        (a, b, c) => { if (a + b > c) return true; throw new Error("Invalid"); },
        (a, b, c) => { if (b + c > a) return true; throw new Error("Invalid"); }
      ]),
      (a, b, c) => a + b + c
    );
  }
}

调整后,OrValidator会自动继承NumberProcessor的[number, number, number]元组类型,子Validator的参数签名会被正确推断,无需手动指定泛型。

内容的提问来源于stack exchange,提问作者Dom Hastings

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 15:31:10