如何在带守卫子句的函数中使用void与number类型?
问题分析与解决方案
首先,你遇到的两个报错本质是对TypeScript返回类型的误解:
void | number不合法是因为TypeScript不允许将void与其他类型组成联合返回类型,void仅能单独作为函数返回类型使用(表示函数没有可被使用的返回值,调用者应该忽略返回结果)。而你在守卫子句里写return;时,实际返回的是undefined,不是void。- 仅指定
number作为返回值时报错,是因为当one或two小于0时,函数会返回undefined,但你声明的返回类型是number,类型不匹配。
可行的解决方案
方案1:将返回类型改为number | undefined
直接匹配函数实际的返回值(要么返回数字,要么返回undefined),类型声明和实际逻辑一致:
function addTwoNumbers(one: number, two: number): number | undefined { if (one < 0 || two < 0) return; return one + two; } const result = addTwoNumbers(-5, -5); console.log(result); // 输出undefined
方案2:守卫子句抛出错误(确保函数始终返回number)
如果你的逻辑是不允许传入负数,可以在守卫子句里抛出错误,这样函数只有在合法输入时才会返回number,不会出现返回undefined的情况:
function addTwoNumbers(one: number, two: number): number { if (one < 0 || two < 0) throw new Error("输入不能为负数"); return one + two; } const result = addTwoNumbers(2, 3); console.log(result); // 输出5
方案3:使用默认值处理返回结果
如果你希望调用者不用处理undefined,可以在调用时给返回结果设置默认值:
function addTwoNumbers(one: number, two: number): number | undefined { if (one < 0 || two < 0) return; return one + two; } const result = addTwoNumbers(-5, -5) ?? 0; // 给undefined设置默认值0 console.log(result); // 输出0
内容的提问来源于stack exchange,提问作者Rock_n_Roll_CRC
相关产品推荐
相关产品推荐

