← Alle AufgabenTypeScript · Middle

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.

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.

  1. Typen
    const r = ok(42);
    type _ = Expect<Equal<typeof r, Result<number, never>>>;
  2. Typen
    const e = err('not found');
    type _ = Expect<Equal<typeof e, Result<never, string>>>;
  3. Typen
    const r = {} as Result<number, string>;
    const m = mapResult(r, (n) => String(n));
    type _ = Expect<Equal<typeof m, Result<string, string>>>;
  4. Typen
    const r = {} as Result<number, string>;
    const v = unwrapOr(r, 0);
    type _ = Expect<Equal<typeof v, number>>;
  5. expect(ok(1)).toEqual({ ok: true, value: 1 });
    expect(err('x')).toEqual({ ok: false, error: 'x' });
  6. expect(mapResult(ok(2), (n) => n * 10)).toEqual({ ok: true, value: 20 });
  7. const f = fn((n) => n * 10);
    const failure = err('bad');
    expect(mapResult(failure, f)).toEqual({ ok: false, error: 'bad' });
    expect(f).toHaveBeenCalledTimes(0);
  8. expect(unwrapOr(ok(5), 0)).toBe(5);
    expect(unwrapOr(err('bad'), 0)).toBe(0);