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

TypeScript可选属性三元展开报错:undefined无法赋值给number类型

TypeScript函数参数二选一调用报错的解决方法

在TypeScript中,我们定义了要求arg1必传、arg2和arg3二选一的函数:

const someFunction = ({ arg1, arg2, arg3 }: { arg1: number } & ({ arg2: number; arg3?: never } | { arg3: number; arg2?: never })) => { return "ignore"; };

但当用以下方式调用时:

const arg1 = 1; const arg2 = 2; const arg3 = undefined;
someFunction({ arg1, ...(arg2 ? {arg2} : {}), ...(arg3 ? {arg3} : {}) });

会出现错误:Type 'undefined' is not assignable to type 'number'。

可以通过以下几种方式解决:

  • 方法一:类型断言
    直接将传入的参数断言为函数的参数类型,强制TypeScript认可类型匹配:

    const arg1 = 1; const arg2 = 2; const arg3 = undefined;
    someFunction({ arg1, ...(arg2 ? {arg2} : {}), ...(arg3 ? {arg3} : {}) } as Parameters<typeof someFunction>[0]);
    
  • 方法二:提前构造符合类型的参数对象
    通过条件判断提前构造严格符合要求的参数,避免展开语法带来的类型歧义:

    const arg1 = 1;
    const arg2 = 2;
    const arg3 = undefined;
    
    const params = arg2 
      ? { arg1, arg2 } 
      : arg3 !== undefined 
        ? { arg1, arg3 } 
        : (() => { throw new Error("必须传入arg2或arg3") })();
    
    someFunction(params);
    
  • 方法三:优化函数类型定义
    将参数类型抽离为别名,让类型推导逻辑更清晰:

    type SomeFunctionParams = { arg1: number } & 
      | { arg2: number; arg3?: never } 
      | { arg3: number; arg2?: never };
    
    const someFunction = ({ arg1, arg2, arg3 }: SomeFunctionParams) => { return "ignore"; };
    

    调用时结合前两种方法处理参数即可。

内容的提问来源于stack exchange,提问作者Björn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:22:23