Код Middle Дженерики обновлено

retry, возвращающий Result вместо исключения

Условие

Напиши retrySync<T>(fn: (attempt: number) => T, maxAttempts: number): Result<T>, где type Result<T> = { ok: true; value: T; attempts: number } | { ok: false; error: string; attempts: number }. Вызывает fn (attempt с 1), пока она бросает, но не больше maxAttempts раз. В error сообщение последней ошибки (если брошена не Error, то String(e)).

simulate(outcomes, max) в заготовке подставляет функцию, которая на попытке i бросает, если outcomes[i-1] строка, иначе возвращает число.

Примеры

simulate(["timeout", "timeout", 42], 5) // {"ok":true,"value":42,"attempts":3}
simulate(["a", "b", "c"], 2) // {"ok":false,"error":"b","attempts":2}
simulate([7], 1) // {"ok":true,"value":7,"attempts":1}

Как подойти

Подсказки: 2
  1. Discriminated union по полю ok: потребитель сузит тип через if (r.ok).
  2. В catch e: unknown, сначала сузь.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.

Термины по теме