为什么应将Promise <void>转换为Promise <any>?

时间:2019-03-04 04:37:49

标签: typescript 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?

1 个答案:

答案 0 :(得分:0)

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);

您可以看到await迭代器返回其中指定的类型,而简单地调用next将返回promise,随后应跟then来检索值(在实际上,也是价值的承诺。)