我写了一个异步生成器,返回承诺。
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?
答案 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
来检索值(在实际上,也是价值的承诺。)