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

Type has no call signatures报错,TypeScript过滤对象类型数据该如何实现?

错误产生原因

你定义的InvoiceItems是字符串为键、InvoiceItemData为值的普通对象类型,而filter是数组的专属实例方法,普通对象本身没有这个方法,所以TypeScript检测到你在非数组类型上调用不存在的filter方法,就抛出了该错误。

过滤实现方案

你需要先把对象转换为可遍历的键值对数组,再进行过滤操作。

常规方案:Object.entries + filter

先通过Object.entries把对象转为[键, 值]格式的数组,再执行过滤,最后可以根据业务需求决定保留数组格式或者转回对象:

// 为空时兜底返回空对象,避免报错
const entryList = Object.entries(props.buyTicketData?.invoiceItems ?? {})
const filteredList = entryList.filter(([key, value]) => 
  value.max == undefined || value.defaultValue === undefined || value.defaultValue == 1
)

// 如果需要保留对象格式,用Object.fromEntries转换
const filteredInvoiceItems = Object.fromEntries(filteredList)

用flatMap实现过滤

可以用flatMap实现相同的过滤效果:符合条件的项返回包裹在数组里的键值对,不符合条件的返回空数组,扁平化后即可得到过滤结果:

const filteredList = Object.entries(props.buyTicketData?.invoiceItems ?? {})
  .flatMap(([key, value]) => {
    return (value.max == undefined || value.defaultValue === undefined || value.defaultValue == 1) 
      ? [[key, value]] 
      : []
  })

如果后续需要同时做元素映射和过滤,flatMap比单独用filter+map写法更简洁。

内容的提问来源于stack exchange,提问作者János

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:54:03