TypeScript中如何一步遍历对象数组获取ID数组与Count总和及正确类型
解决方法
首先纠正你代码里的两个问题:
- 你写的
({id: any})是错误语法,这里的any会被当成变量名而非类型标注,相当于把id重命名为any,完全没必要。TypeScript能自动推断id和count的类型,不需要用any。 - 你的箭头函数语法不完整,缺少闭合的括号,正确写法不需要额外的类型标注。
1. 替代any的正确类型处理
你可以给数据元素定义明确的接口,让类型更清晰,彻底避免any:
// 定义数组元素的类型 interface DataItem { id: number; count: number; } // 给data数组指定类型 const data: DataItem[] = [ { id: 1, count: 3 }, { id: 2, count: 5 }, ];
后续使用map或reduce时,TypeScript会自动识别id和count都是number类型。如果不想额外定义接口,TypeScript也能根据数组字面量自动推断类型,直接写原始data数组同样没问题。
2. 一步获取ids数组和count总和
用Array.reduce()可以只遍历一次数组,同时完成ids收集和count求和,比先map再reduce更高效:
const { ids, sum } = data.reduce( (acc, { id, count }) => { acc.ids.push(id); acc.sum += count; return acc; }, // 初始化累加器:空ids数组和初始总和0 { ids: [] as number[], sum: 0 } ); console.log(ids); // [1, 2] console.log(sum); // 8
如果想更明确指定累加器类型,可用泛型写法:
const { ids, sum } = data.reduce<{ ids: number[]; sum: number }>( (acc, { id, count }) => { acc.ids.push(id); acc.sum += count; return acc; }, { ids: [], sum: 0 } );
补充:分开处理的正确写法
如果还是想分开用map和reduce,正确代码如下(无需any):
const ids = data.map(({ id }) => id); const sum = data.reduce((total, { count }) => total + count, 0);
内容的提问来源于stack exchange,提问作者user19725419
相关产品推荐
相关产品推荐

