Result<T, E>: Fehler ohne Exceptions
Der Typ Result<T, E> ist entweder ein Erfolg { ok: true, value } oder ein Fehlschlag { ok: false, error }. Schreib genau typisierte Helfer dafür.
ok(value) und err(error) erzeugen ein Ergebnis, mapResult(result, fn) wandelt den Wert eines Erfolgs um und reicht einen Fehlschlag unverändert durch (ohne fn aufzurufen), und unwrapOr(result, fallback) liefert den Wert oder den Ersatzwert. Der Fehlertyp soll sich auf das Ergebnis von mapResult übertragen.
Strg+Enter führt die Tests aus. Tab rückt ein; um den Editor per Tastatur zu verlassen, drücke Esc und dann Tab. Der Code wird in diesem Browser gespeichert.
Tests (8)
Typtests prüft der TypeScript-Compiler im strict-Modus. Expect<Equal<A, B>> besteht, wenn die Typen exakt gleich sind, und // @ts-expect-error, wenn die nächste Zeile nicht kompiliert. Der erste Start lädt den Compiler und dauert daher ein paar Sekunden.
- Typen
const r = ok(42); type _ = Expect<Equal<typeof r, Result<number, never>>>;
- Typen
const e = err('not found'); type _ = Expect<Equal<typeof e, Result<never, string>>>;
- Typen
const r = {} as Result<number, string>; const m = mapResult(r, (n) => String(n)); type _ = Expect<Equal<typeof m, Result<string, string>>>;
- Typen
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);