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
相关产品推荐
相关产品推荐

