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

