You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:15:56