Какой тип AsyncGenerator TypeScript дает Promise? - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь назначить тип возврата для функции ниже:

async function *sleepyNumbers() {  // what TypeScript type is this?
  let n = 0;
  while (true) {
    yield new Promise(resolve => resolve(n++));
    await new Promise(resolve => setTimeout(resolve, 500));
  }
}

(async () => {
  for await (const i of sleepyNumbers())
    console.log(i);
})();

Генератор дает Обещание, которое разрешается до number. Установка типа Promise<number> завершается неудачно с этим сообщением об ошибке:

TS2739: Тип «AsyncGenerator» пропускает следующие свойства из типа «Обещание»: then, catch, [Symbol.toStringTag], наконец

Iterable привел к аналогичной ошибке.

Я могу установить тип на AsyncGenerator, но этого недостаточно, чтобы указать c. Каков правильный синтаксис TypeScript для возвращаемого типа этой функции?

1 Ответ

1 голос
/ 14 марта 2020

Это будет AsyncGenerator<number, never, void>:

number - next результат
never возвращает
void - next не получает никаких параметров

Вам также нужно будет явно ввести разрешение обещания:

yield new Promise<number>(resolve => resolve(n++));

Все вместе:

async function *sleepyNumbers(): AsyncGenerator<number, never, void> {
    let n = 0;
    while (true) {
        yield new Promise<number>(resolve => resolve(n++));
        await new Promise(resolve => setTimeout(resolve, 500));
    }
}

(async () => {
    for await (const i of sleepyNumbers())
        console.log(i);
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...