如何正确抽取独立函数并在calclulateOrders中调用
TypeScript 订单统计逻辑抽离实现方案
原代码存在三个可优化点:
- 变量名拼写不一致:定义的分组变量为
groupedOrders,实际取值时误用groupedBYType,直接运行会触发引用错误 - 类型订单计数逻辑内联在主函数中,耦合度高,后续扩展其他类型统计时会导致主函数冗余
- 函数名存在拼写错误:
calclulateOrders正确拼写应为calculateOrders,可按需修正
1. 先定义符合TS规范的类型约束
首先明确各数据结构的类型,避免隐式any,同时为抽离的函数定义明确的输入输出类型:
// 订单类型枚举,按实际业务值扩展 type OrderType = "redOrders" | "blueOrders" | "normalOrders"; // 订单结构类型 interface Order { order: { type: OrderType; [key: string]: unknown; }; [key: string]: unknown; } // 抽离的类型统计函数返回值结构 interface OrderTypeBreakDown { totalCalcOrders: number; // 后续新增其他类型统计字段直接在这里补充,例如 blueOrdersCount: number } // 最终计算结果的嵌套类型 interface TypeOrdersStats { totalCalcOrders: number; } interface Calculations { total: number; typeOrders: TypeOrdersStats; }
2. 实现独立的订单类型拆分统计函数
遵循单一职责原则,把按类型分组、计数的逻辑全部抽离到独立函数中,后续调整统计规则只需要修改这个函数:
import _ from "lodash"; // 保留原代码的lodash依赖,也可以替换为原生实现 /** * 按订单类型统计对应数量 * @param orders 原始订单列表 * @returns 各类型订单的统计结果 */ const orderTypeBreakDown = (orders: Order[]): OrderTypeBreakDown => { const groupedByType = _.groupBy(orders, "order.type"); return { // 用可选链+空值合并运算符简化原三元判断,逻辑完全等价:分组不存在时兜底返回0 totalCalcOrders: groupedByType["redOrders"]?.length ?? 0 }; };
如果不想引入lodash依赖,可以用原生reduce实现分组逻辑,替换上面的_.groupBy调用:
const groupedByType = orders.reduce<Record<OrderType, Order[]>>((acc, cur) => { const curType = cur.order.type; if (!acc[curType]) acc[curType] = []; acc[curType].push(cur); return acc; }, {} as Record<OrderType, Order[]>);
3. 重构主计算函数,调用抽离的逻辑
移除原代码中无意义的嵌套块级作用域,修正变量拼写问题,主函数只负责组装最终返回结果:
export const calculateOrders = (orders: Order[]): Calculations => { const typeBreakdownStats = orderTypeBreakDown(orders); return { total: orders.length, typeOrders: { totalCalcOrders: typeBreakdownStats.totalCalcOrders } }; };
如果需要兼容原有拼写错误的函数名导出,可以额外加一行别名导出,不影响旧代码调用:
export const calclulateOrders = calculateOrders;
内容的提问来源于stack exchange,提问作者wewe wewe
相关产品推荐
相关产品推荐

