reduce的previousValue与currentValue可类型不同吗?附TS报错排查
问题核心原因
你的reduce回调函数存在语法结构错误,多嵌套了一层未执行的匿名函数,逻辑完全没有按预期运行:
- 你给reduce传入的第一层回调
(newObj, [key, val]) => {}内部没有直接返回累计的数字值,反而定义了一个从未执行的第二层函数(cumulativValue, ii) => {},最终回调返回值是函数类型,和你初始值设置的数字类型冲突,触发TypeScript类型推断异常,抛出类型不匹配错误。 - 参数命名也存在逻辑混乱:第一层回调的第一个参数就是你需要的累计值,不需要再单独定义第二层的cumulativValue参数。
修复后的代码
totalPrice = Object.entries( buyTicketData.pricingAndInvoicingType === PricingAndInvoicingType.invoiceItems ? buyTicketData.invoiceItems : buyTicketData.pricingOptions[startPaymentIn?.pricingOptionId]?.invoiceItems ?? {} ).reduce((cumulativeValue, [key, val]) => { return cumulativeValue + ((val.quantity ?? startPaymentIn?.invoiceItems?.[key] ?? 0) * parseInt(val.unitPrice)); }, 0);
额外优化点
- 补充了
pricingOptions[startPaymentIn?.pricingOptionId]后的可选链操作符?.,避免pricingOptionId不存在时访问invoiceItems抛出运行时错误 - 给取不到invoiceItems的场景补充了兜底空对象
?? {},避免Object.entries接收到undefined报错 - 补充了startPaymentIn?.invoiceItems后的可选链操作符
?.,避免访问不存在的key时报错 - 把原来的双等号改成了全等号
===,避免类型隐式转换导致的判断错误
内容的提问来源于stack exchange,提问作者János
相关产品推荐
相关产品推荐

