【问题标题】:Why should I cast Promise<void> to Promise<any>? [duplicate]为什么要将 Promise<void> 转换为 Promise<any>? [复制]
【发布时间】:2019-07-25 09:07:14
【问题描述】:

我编写了一个返回 Promise 的异步生成器。

function convert(): Promise<void> { return null; }

async function* conversions(): AsyncIterableIterator<Promise<void>> {
  await convert();
  yield convert(); // error TS2322: Type 'void' is not assignable to type 'Promise<void>'.
  yield convert() as Promise<any>;
}

我认为应该没有错误。为什么会出现 TS2322?

【问题讨论】:

  • 我发现了问题,而且似乎重复..

标签: typescript promise


【解决方案1】:

AsyncIterableIterator的泛型参数不代表promise,而是代表内部值,可以通过await这个迭代器获取。所以,这段代码有效:

function convert(): Promise<void> { return Promise.resolve(); }

async function* conversions(): AsyncIterableIterator<void> {
  await convert();
  yield convert();
}

旁注:如您所见,convert 函数的变体未编译,因此我对其进行了一些更改以消除错误。


为了了解这一切是如何工作的,让我们为迭代器添加一些有意义的返回类型。像这样的:

async function convert(): Promise<number> { return 0; }

async function* conversions(): AsyncIterableIterator<number> {
    await convert();
    yield convert();
}

async () => {
    const num: number = (await conversions().next()).value;
}

const num: Promise<number> = conversions().next().then((ret) => ret.value);

您可以看到 awaiting 您的迭代器返回其中指定的类型,而简单地调用 next 将返回应遵循 then 以检索值的承诺(事实上,再次,承诺值)。

【讨论】:

  • 那么等待你的conversions 是否会返回一个承诺?
  • 抱歉,(await conversions().next()).value 是否返回承诺?
  • 当然不是。如果func 返回Promise&lt;T&gt;,则await func() 返回T。这里也是一样 - 我稍后会更新答案。
  • 也许我的问题缺少我的描述。感谢您的友好回复。
猜你喜欢
  • 2022-01-07
  • 2018-11-04
  • 2017-10-31
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 2017-01-12
  • 2016-07-05
相关资源
最近更新 更多