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

TypeScript中使用reduce替代filter和map的方法及类型报错修复

报错原因

TS 无法自动推导你给的初始空数组[]的类型,默认会将其推导为never[](只能存放never类型值的数组),而你后续往数组中插入的是employer类型的对象,类型不匹配就触发了报错。

修复方案

有两种常用的修复方式:

方式1:给初始值显式断言类型

直接给初始空数组标注为employer[]类型即可:

interface employer {
  name: string;
  age: number;
}

const arr: employer[] = [{name:'Amy',age:18},{name:'Bob',age:20}];

// 初始值加 as employer[] 显式指定类型
let data = arr.reduce((c, b) =>  b.age > 18 ? [...c, b] : c, [] as employer[])

console.log(data)

方式2:给reduce方法传入泛型参数

在调用reduce时直接指定泛型,明确累加值的类型为employer[]:

// 给reduce指定泛型参数
let data = arr.reduce<employer[]>((c, b) =>  b.age > 18 ? [...c, b] : c, [])
用reduce替代filter、map的方法

reduce的本质是遍历数组,对累加值进行自定义更新后返回,完全可以覆盖filter、map的能力,甚至可以一次遍历同时完成过滤+转换,减少数组遍历次数:

  • 替代filter:判断当前项是否符合过滤条件,符合就加入累加数组,不符合就直接返回原累加数组,就是你当前的实现逻辑。
  • 替代map:遍历每一项,对当前项做转换后加入累加数组,比如提取所有人员的姓名:
const names = arr.reduce<string[]>((c, b) => [...c, b.name], [])
// 等效于 arr.map(item => item.name)
  • 同时替代filter+map:一次遍历完成过滤和转换,比如提取所有年龄大于18的人员姓名:
const adultNames = arr.reduce<string[]>((c, b) => {
  return b.age > 18 ? [...c, b.name] : c
}, [])
// 等效于 arr.filter(item => item.age > 18).map(item => item.name),但只遍历一次数组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:24:03