Код 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
- Discriminated union по полю
ok: потребитель сузит тип черезif (r.ok). - В
catche: unknown, сначала сузь.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.