如何重构方法以支持按属性求和对象数组或数值数组
重构方案:用函数重载支持双场景求和
你可以通过TypeScript函数重载来实现这个需求,让calculateSum既能直接处理数字数组求和,也能保留原有的对象数组按指定属性求和的能力,且两种场景的调用方式符合预期:
// 重载签名1:处理数字数组,无需传入property function calculateSum(array: number[]): number; // 重载签名2:处理对象数组,需要指定求和属性 function calculateSum<T extends object, K extends keyof T>(array: T[], property: K): number; // 函数实现体 function calculateSum(array: (number | object)[], property?: keyof any): number { if (!array.length) return 0; // 处理数字数组场景 if (!property) { return (array as number[]).reduce((acc, num) => acc + num, 0); } // 处理对象数组场景(保留原逻辑并优化) return (array as object[]).reduce((acc, item) => { // 确保属性值转为数字,避免非数字类型导致NaN const value = +(item as any)[property]; return acc + (isNaN(value) ? 0 : value); }, 0); }
关键说明:
- 重载签名明确了两种调用方式的类型约束,TypeScript会根据传入的参数自动匹配对应的签名,提供准确的类型提示。
- 实现体中通过
property是否存在来区分场景:- 无
property时,判定为数字数组,直接累加元素。 - 有
property时,沿用原逻辑并增加了isNaN判断,避免属性值无法转为数字时导致结果异常。
- 无
- 增加了空数组判断,直接返回0,逻辑更严谨。
使用示例:
// 数字数组求和 const numSum = calculateSum([1, 3, 5]); console.log(numSum); // 输出 9 // 对象数组按属性求和 const objSum = calculateSum([{ price: 10 }, { price: 20 }, { price: 30 }], 'price'); console.log(objSum); // 输出 60 // 空数组返回0 const emptySum = calculateSum([]); console.log(emptySum); // 输出 0
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

