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

TypeScript类型错误:对象数组无法分配给DonutChartData[]类型怎么解决

问题根源

你遇到的类型报错核心是两点类型不匹配:

  • 你定义的DonutChartData接口要求flowItem字段是FlowItem枚举类型,但TS自动推导newGroups函数返回值时,将flowItem识别为了string类型
  • newGroups函数没有显式声明返回值类型,TS无法自动将你构造的数组和DonutChartData[]做关联校验
修复步骤
  1. 修正newGroups入参和返回值类型:将入参flowItem的类型从string改为FlowItem,同时显式声明函数返回值为DonutChartData[]
  2. 显式定义groups对象的属性类型,避免TS自动推导的类型和预期不符
  3. (可选优化)将无意义的map遍历改为forEach,你没有用到map返回的数组,用forEach更符合语义
修复后完整代码
// 提前确保FlowItem枚举已经正确定义,示例:
// enum FlowItem {
//   uncategorized = 'uncategorized',
//   // 其他你用到的枚举值
// }

export interface DonutChartData {
  flowItem: FlowItem;
  title: string;
  count: number;
}

const newGroups = (validCapacities: CapacityItem[], flowItem: FlowItem): DonutChartData[] => {
  const datesBreakpoint = {
    month: 30,
    trimester: 90,
    semester: 180,
  };
  // 显式定义groups的类型,确保每个属性都是DonutChartData类型
  const groups: Record<string, DonutChartData> = {
    lessThanOneMonth: {
      flowItem,
      title: 'Less than 1 month',
      count: 0,
    },
    oneToThreeMonths: {
      flowItem,
      title: '1 - 3 months',
      count: 0,
    },
    threeToSixMonths: {
      flowItem,
      title: '3 - 6 months',
      count: 0,
    },
    sixPlus: {
      flowItem,
      title: '6+ months',
      count: 0,
    },
  }
  // 把map改为forEach
  validCapacities.forEach((capacity) => {
    if (capacity.daysToWorkOffWIP < datesBreakpoint.month) {
      if (capacity.daysToWorkOffWIP < 0 || capacity.neglectedWIP) {
        groups.lessThanOneMonth.flowItem = FlowItem.uncategorized;
      }
      groups.lessThanOneMonth.count++;
      return;
    }
    if (capacity.daysToWorkOffWIP < datesBreakpoint.trimester) {
      groups.oneToThreeMonths.count++;
      return;
    } 
    if (capacity.daysToWorkOffWIP < datesBreakpoint.semester){
      groups.threeToSixMonths.count++;
      return;
    }
    groups.sixPlus.count++;
  })
  const capacitiesWithData = Object.values(groups).filter(({ count }) => count > 0);
  return capacitiesWithData;
}

// 调用时确保传入的flowItem是FlowItem枚举类型的值,不是普通字符串
const testnewGroups: DonutChartData[] = newGroups(data.productsCapacity, flowItem);

如果调用时你传入的flowItem确实是字符串类型,且确认该字符串是FlowItem枚举定义的合法值,可以用类型断言临时兼容:flowItem as FlowItem。

内容的提问来源于stack exchange,提问作者vbotio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:21:03