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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:37:15