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

