Result<T, E>: помилки без винятків
Тип Result<T, E> описує або успіх { ok: true, value }, або помилку { ok: false, error }. Напишіть до нього помічники з точними типами.
ok(value) і err(error) створюють результат, mapResult(result, fn) перетворює значення успіху й пропускає помилку без змін (не викликаючи fn), unwrapOr(result, fallback) повертає значення або запасний варіант. Тип помилки має доходити до результату mapResult.
Ctrl+Enter - запустити тести. Tab - відступ; щоб вийти з редактора клавіатурою, натисніть Esc, а потім Tab. Код зберігається в цьому браузері.
Тести (8)
Тести типів перевіряє компілятор TypeScript у режимі strict. Expect<Equal<A, B>> проходить, коли типи збігаються точно, а // @ts-expect-error - коли наступний рядок не компілюється. Перший запуск завантажує компілятор, тож триває кілька секунд.
- типи
const r = ok(42); type _ = Expect<Equal<typeof r, Result<number, never>>>;
- типи
const e = err('not found'); type _ = Expect<Equal<typeof e, Result<never, string>>>;
- типи
const r = {} as Result<number, string>; const m = mapResult(r, (n) => String(n)); type _ = Expect<Equal<typeof m, Result<string, string>>>;
- типи
const r = {} as Result<number, string>; const v = unwrapOr(r, 0); type _ = Expect<Equal<typeof v, number>>;
expect(ok(1)).toEqual({ ok: true, value: 1 }); expect(err('x')).toEqual({ ok: false, error: 'x' });
expect(mapResult(ok(2), (n) => n * 10)).toEqual({ ok: true, value: 20 });
const f = fn((n) => n * 10); const failure = err('bad'); expect(mapResult(failure, f)).toEqual({ ok: false, error: 'bad' }); expect(f).toHaveBeenCalledTimes(0);
expect(unwrapOr(ok(5), 0)).toBe(5); expect(unwrapOr(err('bad'), 0)).toBe(0);