【发布时间】: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<boolean|string>[] = [promise1, promise2]; -
这可能是因为 TypeScript 无法将
promises数组推断为 Promise 的可迭代,而是一个联合类型的数组,这会导致类型不匹配。就像 Christoph 所建议的那样,您可以简单地将promises转换为Promise<any>[]类型,作为对 TypeScript 的提示。 -
感谢您的 cmets,但问题是 promise 数组的大小不固定。问题所基于的原始代码用于处理数据库查询。所以数组中的 Promise 数量可能会随着时间的推移而增加,并且它可以包含很多不同的类型。
-
如果您不想列出可能的返回类型,只需使用 Terry 在评论中所写的
any。 -
您的示例最初是 did work 和 dev version of TS 3.9。不幸的是,
awaited一直是 reverted,因此我们将不得不等待更长的时间并使用其中一种解决方法。
标签: typescript promise