首页 > 解决方案 > 使用 Promise.all 在 TypeScript 中返回数组后无法在 void 上调用数组方法

问题描述

供参考:如何将 Promise.all() 与 Typescript 一起使用

我有一个我想在其中使用 Promise.all() 的 TypeScript 应用程序。

我创建了一个 promise 数组,在数组上调用 Promise.all,然后使用 .then 映射响应数组。

稍后在应用程序中,我在响应数组上再次调用 .map,但 TypeScript 抱怨“类型 'void | any[]' 上不存在属性 'map'”。(在我的实际应用中,我调用的是.filter,但问题适用于所有数组方法)。

我似乎无法绕过这样一个事实,即对于 TypeScript,我的 Promise.all 可能返回 void 而不是 any[] 的数组。

这是一个使用 Axios 发出三个请求的示例:

const requests = [1, 2, 3].map((request) =>
 axios.get(`http://localhost:3000/test${request}`)
);

const promises = await Promise.all(requests)
  .then((responses) => responses.map((response) => response.data))
  .catch(({ message }) => console.log(message));

// later on...

const responses = promises.map(promise => promise.hello);

正是这最后一行导致了错误“类型'void | any []'上不存在属性'map'。类型'void'.ts(2339)上不存在属性'map'”。

如何告诉编译器我的 Promise.all 将生成一个数组?

标签: javascripttypescript

解决方案


正如@jcalz 有用地指出的那样,这里的问题是 .catch 将返回一种 void。

检查 promises 数组是否存在会导致编译器错误消失:

let responses;
if(promises) {
  responses = promises.map(response => response.hello);
}

推荐阅读