#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 жалуется, что:
- Возвращаемый тип функции неверен:
- Вызов yield* аналогично неверен, поскольку функция возвращает тип:
Какой правильный тип для возврата функции или я делаю что-то еще неправильно?
Комментарии:
1. Удалите аннотацию возвращаемого типа из генератора и получите щедрую информацию о типе
Ответ №1:
Добавление возвращаемого типа AsyncGenerator<any>
в определение функции генератора, похоже, делает компилятор счастливым. Также, похоже, требуется целевая библиотека tsconfig не менее es2019.
Комментарии:
1. Аннотация типа Are теряет точность, которую язык выводит, когда вы опускаете возвращаемый тип. Компилятор typescript понимает синтаксис для асинхронных генераторов generators и выводит тип, который намного более надежен, чем ваша явная аннотация, включающая любые
2. Рекурсивная форма генератора, казалось, испортила вывод типа. AsyncGenerator<_something_> Был тем, что я искал.