javascript - 使用 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 将生成一个数组?
解决方案
正如@jcalz 有用地指出的那样,这里的问题是 .catch 将返回一种 void。
检查 promises 数组是否存在会导致编译器错误消失:
let responses;
if(promises) {
responses = promises.map(response => response.hello);
}
推荐阅读
- java - 将值传递给java中的成员变量
- r - 如何通过两个循环绘制图形
- swift - 标准输出 HackerRank Swift 没有响应
- ruby-on-rails - 有没有办法为 Activerecord 中的单个查询创建临时列?
- java - Calendar.getTime IllegalArgumentException
- debugging - 如何让用户将照片提交到网页上
- java - 这是用Java表示扑克牌的正确方法吗?
- javascript - 访问器属性如何在 Javascript 内部工作?
- c++ - 使用自定义nodejs插件时“找不到指定的模块”
- c++ - 使用 std::for_each 迭代和打印 std::map