TypeScript中如何基于类泛型TReq动态调整方法的参数类型?
实现基于泛型参数条件化的Processor类
你可以通过TypeScript条件类型来实现这个需求,根据TReq是否为never类型,动态切换handler和handleRequest的参数要求。具体实现步骤如下:
1. 定义条件化的处理器类型
先声明一个类型别名,用来根据TReq的类型决定处理器函数的签名:
type Handler<TReq, TRes> = TReq extends never ? () => TRes : (input: TReq) => TRes;
2. 修改Processor类实现
利用上述条件类型,调整类的构造函数参数和handleRequest方法的参数列表:
class Processor<TReq, TRes> { constructor(private handler: Handler<TReq, TRes>) {} public handleRequest(...args: TReq extends never ? [] : [input: TReq]): TRes { // 类型断言保证参数与handler签名匹配,因条件类型已确保一致性 return this.handler(...(args as [TReq])); } }
3. 验证效果
普通泛型参数场景
const myProcessor = new Processor<string, string>( (input: string) => `Hello ${input}` ); myProcessor.handleRequest('World'); // 正常接收string参数,返回"Hello World"
TReq为never的场景
const myProcessor = new Processor<never, string>( () => 'Hi' ); myProcessor.handleRequest(); // 无需传入参数,返回"Hi"
原理说明
- 条件类型
TReq extends never ? ... : ...会在编译时判断泛型参数TReq的类型:当TReq是never时,会匹配无参函数分支;否则匹配带TReq类型参数的分支。 handleRequest使用剩余参数...args配合条件类型,实现了参数列表的动态切换,TypeScript会根据泛型参数自动推导调用时的参数要求。
内容的提问来源于stack exchange,提问作者Andry
相关产品推荐
相关产品推荐

