首页 > 解决方案 > 打字稿异步生成器编译/类型问题

问题描述

我无法让 Webstorm 对我正在尝试编写的异步生成器感到满意。这个想法是从 Elastic Search 中读取数据并通过 Node 流发送数据。这是代码,然后我将在下面发布错误:

let resultsSent = 0;
let response: SearchResponse<any> = await client.search(query);
async function* resultGenerator(sr: SearchResponse<any>): Promise<IteratorResult<any>> {
    for (let hit of sr.hits.hits) {
        yield hit;
    }
    resultsSent += sr.hits.hits.length;
    console.log(`Sent ${resultsSent} results from ES to stream.`);
    if (sr.hits.total > resultsSent) {
        const params: ScrollParams = {
            scrollId: response._scroll_id,
            scroll: '60s'
        };
        response = await client.scroll(params);
        yield* resultGenerator(response);
    }
}
return new Readable({
    objectMode: true,
    async read(size: number) {
        for await (const hit of resultGenerator(response)) {
            if (!this.push(hit)) {
                return;
            }
        }
    }
});

IDE 抱怨说:

  1. 函数的返回类型不正确:返回类型的错误消息
  2. yield* 调用同样不正确,因为函数返回类型:产量错误消息*

函数返回的正确类型是什么,还是我做错了什么?

标签: typescriptasync-awaitgenerator

解决方案


在生成器函数定义中添加返回类型AsyncGenerator<any>似乎会让编译器满意。似乎还需要至少 es2019 的 tsconfig lib 目标。


推荐阅读