【问题标题】:Typescript throws an error when calling Promise.all with an array of promises使用一组承诺调用 Promise.all 时,Typescript 会引发错误
【发布时间】:2020-07-14 12:14:41
【问题描述】:

我对 Typescript 中的 Promises 有疑问。我正在尝试使用 一系列承诺 来调用 Promise.all,但相反,我得到了

没有重载匹配这个调用。 最后一个重载给出了以下错误。 '(Promise | Promise)[]' 类型的参数不可分配给 'Iterable'。 [...]

下面是我所指的简化示例:

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

【问题讨论】:

  • 不是答案,因为我无法解释它不能自动工作的原因。但是一个简单的解决方案是帮助编译器并告诉他正确的类型,比如const promises: Promise&lt;boolean|string&gt;[] = [promise1, promise2];
  • 这可能是因为 TypeScript 无法将 promises 数组推断为 Promise 的可迭代,而是一个联合类型的数组,这会导致类型不匹配。就像 Christoph 所建议的那样,您可以简单地将 promises 转换为 Promise&lt;any&gt;[] 类型,作为对 TypeScript 的提示。
  • 感谢您的 cmets,但问题是 promise 数组的大小不固定。问题所基于的原始代码用于处理数据库查询。所以数组中的 Promise 数量可能会随着时间的推移而增加,并且它可以包含很多不同的类型。
  • 如果您不想列出可能的返回类型,只需使用 Terry 在评论中所写的 any
  • 您的示例最初是 did workdev version of TS 3.9。不幸的是,awaited 一直是 reverted,因此我们将不得不等待更长的时间并使用其中一种解决方法。

标签: typescript promise


【解决方案1】:

问题与 Promises 本身无关,而与 TypeScript 推断元组类型的方式有关。

您可以在this answer 中阅读更多关于实际问题的信息,但其要点如下

const a = [1, "a", true] //<- (string | number | boolean)[], not [number, string, boolean]

这个问题应该通过引入variadic kinds in TS 4.0 来解决。目前,有两种方法可以随心所欲。

第一个是const assertions

const b = [1, "a", true] as const // <- [number, string, boolean]

第二个是使用一个实用函数,就像我在上面链接的答案中发布的那样。


在您的特定情况下,键入 Promise.all 的方式与 TS 如何推断 promises 的类型不符。这很容易通过使用上述方法之一的适当元组来解决。

Playground link

【讨论】:

    猜你喜欢
    • 2017-02-27
    • 2017-05-17
    • 2016-11-25
    • 1970-01-01
    • 2018-05-05
    • 2018-11-29
    • 2020-06-23
    • 1970-01-01
    • 2018-01-05
    相关资源
    最近更新 更多