TypeScript类型错误:对象数组无法分配给DonutChartData[]类型怎么解决
问题根源
你遇到的类型报错核心是两点类型不匹配:
- 你定义的
DonutChartData接口要求flowItem字段是FlowItem枚举类型,但TS自动推导newGroups函数返回值时,将flowItem识别为了string类型 newGroups函数没有显式声明返回值类型,TS无法自动将你构造的数组和DonutChartData[]做关联校验
修复步骤
- 修正
newGroups入参和返回值类型:将入参flowItem的类型从string改为FlowItem,同时显式声明函数返回值为DonutChartData[] - 显式定义
groups对象的属性类型,避免TS自动推导的类型和预期不符 - (可选优化)将无意义的
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
相关产品推荐
相关产品推荐

