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

TypeScript:泛型函数参数的条件可选实现

解决方案:利用条件参数元组实现动态可选参数

要实现当Params为空对象时方法参数可省略的需求,可以通过条件类型定义参数元组的方式来实现,核心思路是根据Params是否为空来动态生成函数的参数列表:

// 定义条件参数元组:当Params为空对象时,参数列表为空;否则要求传入Params类型参数
type ParamsArgs<Params> = keyof Params extends never ? [] : [params: Params];

class Statement<Params> {
    exec(...args: ParamsArgs<Params>) {
        // 统一处理参数:空场景下默认取空对象
        const params = args[0] ?? {};
        /* 实际业务逻辑 */
    }
    all(...args: ParamsArgs<Params>) {
        const params = args[0] ?? {};
        /* 实际业务逻辑 */
    }
    one(...args: ParamsArgs<Params>) {
        const params = args[0] ?? {};
        /* 实际业务逻辑 */
    }
}

测试验证

带参数的场景

const create_stmt = new Statement<{ username: string; password: string }>();
create_stmt.exec({ username: 'bob', password: 'secret' }); // ✅ 正常调用
create_stmt.exec(); // ❌ 报错:缺少必要参数,符合预期

空参数场景

const list_stmt = new Statement<{}>();
const rows = list_stmt.all(); // ✅ 无需传参,符合预期
list_stmt.all({}); // ✅ 也允许传入空对象,兼容原有逻辑

为什么之前的方案不生效

之前尝试用T | undefined的方式,本质只是允许参数传入undefined,但并没有把参数标记为可选。TypeScript中,只有当参数用?标记或者参数列表为空时,才允许省略参数。而通过条件参数元组,我们直接动态生成了两种参数列表:空列表(允许省略)或单参数列表(必须传入),完美匹配需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:15:34