Проблемы с компиляцией / типом асинхронного генератора Typescript

#typescript #async-await #generator

#typescript #асинхронное ожидание #генератор

Вопрос:

У меня возникли проблемы с тем, чтобы Webstorm был доволен асинхронным генератором, который я пытаюсь написать. Идея состоит в том, чтобы считывать данные из эластичного поиска и отправлять их по потоку узла. Вот код, а затем я опубликую ошибки ниже:

 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* аналогично неверен, поскольку функция возвращает тип: Сообщение об ошибке при выходе*

Какой правильный тип для возврата функции или я делаю что-то еще неправильно?

Комментарии:

1. Удалите аннотацию возвращаемого типа из генератора и получите щедрую информацию о типе

Ответ №1:

Добавление возвращаемого типа AsyncGenerator<any> в определение функции генератора, похоже, делает компилятор счастливым. Также, похоже, требуется целевая библиотека tsconfig не менее es2019.

Комментарии:

1. Аннотация типа Are теряет точность, которую язык выводит, когда вы опускаете возвращаемый тип. Компилятор typescript понимает синтаксис для асинхронных генераторов generators и выводит тип, который намного более надежен, чем ваша явная аннотация, включающая любые

2. Рекурсивная форма генератора, казалось, испортила вывод типа. AsyncGenerator<_something_> Был тем, что я искал.