首页 > 解决方案 > 我为什么要施放 Promise承诺?

问题描述

我写了一个返回 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?

标签: typescriptpromise

解决方案


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

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以检索值(实际上,再次是值的承诺)。


推荐阅读