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

如何调用forEach时保持函数返回类型为Promise<MyObject[]>

解决search函数返回类型变为Promise的问题

你的问题出在forEach方法的返回值上:forEach本身没有返回值(返回void),所以最后一个.then回调返回的是void,导致整个Promise的类型变成了Promise<void>,覆盖了原本的Promise<MyObject[]>。

你可以通过以下两种方式解决,保持原返回类型:

方案一:遍历后返回原数组

既然convertIDs是直接修改数组中的原对象,你可以在forEach执行完后,手动返回原数组,这样.then的返回值就还是MyObject[]:

export function search(args: SearchInput) {
    return SomeInterface.performSearch(args)
        .then(xmlRequest => AnotherInterface.post(xmlRequest))
        .then(xmlResponse => SomeInterface.performSearchResponse(xmlResponse))
        .then(searchResponse => {
            searchResponse.forEach(convertIDs);
            return searchResponse; // 返回原数组,维持Promise<MyObject[]>类型
        });
}

方案二:使用map方法替代forEach

map方法会遍历数组并返回一个新数组,刚好符合你需要的返回类型。因为convertIDs已经返回了修改后的对象,直接用map就能得到MyObject[]:

export function search(args: SearchInput) {
    return SomeInterface.performSearch(args)
        .then(xmlRequest => AnotherInterface.post(xmlRequest))
        .then(xmlResponse => SomeInterface.performSearchResponse(xmlResponse))
        .then(searchResponse => searchResponse.map(convertIDs)); // map返回MyObject[]
}

两种方案的区别:

  • 方案一属于原地修改数组元素,返回的是原数组引用;
  • 方案二会生成一个新数组(但数组内的对象还是原来的引用,因为是引用类型),如果业务不介意生成新数组,这种写法更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 03:07:05