使用TypeScript的reduce按materialId拆分对象数组
按materialId分组StatisticsOfScrapDeliveriesItems数组的TypeScript解决方案
你遇到的类型错误本质是TypeScript无法自动推断reduce返回值和初始值的类型,显式指定泛型类型即可解决。以下是具体实现:
1. 明确类型定义(若未定义)
先确保你的StatisticsOfScrapDeliveriesItems接口已正确声明,示例如下:
interface StatisticsOfScrapDeliveriesItems { materialId: string | number; // 根据实际业务调整类型,比如string/number // 其他业务属性示例 scrapQuantity: number; deliveryTime: Date; }
2. 带类型注解的分组实现
使用reduce时,显式指定返回值的泛型类型,并对初始值做类型断言,避免TS类型推断错误:
const scrapDeliveries: StatisticsOfScrapDeliveriesItems[] = [ { materialId: 'STEEL-001', scrapQuantity: 50, deliveryTime: new Date() }, { materialId: 'ALUM-002', scrapQuantity: 30, deliveryTime: new Date() }, { materialId: 'STEEL-001', scrapQuantity: 25, deliveryTime: new Date() }, ]; // 按materialId分组的函数 const groupByMaterialId = (items: StatisticsOfScrapDeliveriesItems[]) => { return items.reduce<Record<StatisticsOfScrapDeliveriesItems['materialId'], StatisticsOfScrapDeliveriesItems[]>>( (acc, currentItem) => { const id = currentItem.materialId; // 若当前materialId未创建分组数组,先初始化 if (!acc[id]) { acc[id] = []; } acc[id].push(currentItem); return acc; }, // 对初始空对象做类型断言,匹配目标返回类型 {} as Record<StatisticsOfScrapDeliveriesItems['materialId'], StatisticsOfScrapDeliveriesItems[]> ); }; // 调用分组函数 const groupedResult = groupByMaterialId(scrapDeliveries); // 快速访问指定materialId的子数组 const steelItems = groupedResult['STEEL-001'];
3. 错误原因说明
纯JavaScript的reduce方案在TypeScript中报错,是因为TS无法推断初始值{}的具体类型(默认推断为{}),也无法确定acc的键值对类型。通过显式指定reduce的泛型参数(即最终返回的Record类型),并对初始值做类型断言,就能让TS明确类型约束,消除类型错误。
内容的提问来源于stack exchange,提问作者Emili Bellot Pulido
相关产品推荐
相关产品推荐

