typescript - 使用一组承诺调用 Promise.all 时,Typescript 会引发错误
问题描述
我对 Typescript 中的 Promises 有疑问。我试图用一系列承诺来调用 Promise.all但相反,我得到了
没有重载匹配此调用。最后一个重载给出了以下错误。'(Promise | Promise)[]' 类型的参数不可分配给 'Iterable<boolean | PromiseLike>'。[...]
下面是我所指的简化示例:
const promise1 = Promise.resolve(true); //promise1:Promise<boolean>
const promise2 = Promise.resolve('promise...'); //promise2:Promise<string>
const promises = [promise1, promise2];
Promise.all(promises); //Error here
但是,下面的代码按我的假设工作:
const promise1 = Promise.resolve(true);
const promise2 = Promise.resolve('promise...');
Promise.all([promise1, promise2]);
对我来说似乎是一个错误,但我不确定。我一直在浏览 GitHub,搜索这个问题,但我没有找到任何匹配项。或者我做错了什么并且有一个解决方案,所以你可以克服这个问题。显然,我不能只在我的主代码中编写 Promise.all([promise1, promise2]),因为 Promise 数组是动态的。
我正在使用打字稿@3.9.6
。
解决方案
这个问题与 Promises 本身无关,而是与 TypeScript 推断元组类型的方式有关。
您可以在此答案中阅读有关实际问题的更多信息,但其要点如下
const a = [1, "a", true] //<- (string | number | boolean)[], not [number, string, boolean]
这个问题应该通过在 TS 4.0 中引入可变参数来解决。目前,有两种方法可以做你想做的事。
第一个是const 断言
const b = [1, "a", true] as const // <- [number, string, boolean]
第二个是使用一个实用函数,就像我在上面链接的答案中发布的那样。
在您的特定情况下,Promise.all
键入的方式与 TS 如何推断promises
. 这很容易通过使用上述方法之一的适当元组来解决。
推荐阅读
- c++ - C ++,Windows(有时)在获取应用程序屏幕截图时出现白屏
- c++ - 没有发生整数溢出:它们从 0 重新开始
- ruby-on-rails - 如何使用按钮链接删除与相同键嵌套的特定哈希键和值
- powershell - 如何逃脱星号?
- java - 如何正确使用 Gson 通过静态实用程序方法反序列化泛型类型的对象?
- python-3.x - 如何比较两个未排序的数据框并报告差异
- hibernate - 与共享主键和子端@OneToOne 的单向一对一关系
- lua - 如何将多个值返回到表中?不返回表 [lua]
- c++ - gcc --version-script 无法识别 int64_t
- python - Python Turtle 如何创建碰撞