如何调用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
相关产品推荐
相关产品推荐

