Result-/Either-ähnliche Typen
Modellieren Sie Erfolg und Fehlschlag explizit mit einer Result-/Either-Union, ergänzen Sie Hilfsfunktionen (map/flatMap/mapError) und halten Sie Abläufe ohne try/catch überall vorhersehbar.
Result-/Either-ähnliche Typen ist eine kostenlose TypeScript Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 2. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des TypeScript Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der TypeScript Academy-Kurs umfasst insgesamt 2 Lektionen.
Einführung
Ziel: Machen Sie Fehler sichtbar. Sie modellieren Ergebnisse mit einer diskriminierten Union, komponieren sie mit Helpern und wandeln Ausnahmen an der Grenze um.
- Result-Typ
- map/flatMap/mapError
- HTTP-Integration
Result-Grundlagen
Erstellen Sie eine kleine Result-Utility: die Konstruktoren ok/err sowie map, flatMap und mapError zur Komposition.
export type Ok<T> = { ok: true; value: T }
export type Err<E> = { ok: false; error: E }
export type Result<T, E> = Ok<T> | Err<E>
export const ok = <T>(value: T): Ok<T> => ({ ok: true, value })
export const err = <E>(error: E): Err<E> => ({ ok: false, error })
export function map<T, E, U>(r: Result<T, E>, f: (t: T) => U): Result<U, E> {
return r.ok ? ok(f(r.value)) : r
}
export function flatMap<T, E, U>(r: Result<T, E>, f: (t: T) => Result<U, E>): Result<U, E> {
return r.ok ? f(r.value) : r
}
export function mapError<T, E, F>(r: Result<T, E>, g: (e: E) => F): Result<T, F> {
return r.ok ? r : err(g(r.error))
}Domänenfehler
Modellieren Sie Domänenfehler als diskriminierte Union mit einem tag. Jeder Zweig enthält präzise Daten für aussagekräftige Meldungen.
export type CreateUserError =
| { tag: "InvalidEmail"; detail?: string }
| { tag: "Duplicate"; email: string }
export function validateEmail(email: string): Result<string, CreateUserError> {
const okEmail = /.+@.+/.test(email)
return okEmail ? ok(email.toLowerCase()) : err({ tag: "InvalidEmail", detail: "bad format" })
}
const existing = new Set(["ada@example.com"]) // pretend DB
export function saveUser(email: string): Result<{ id: string }, CreateUserError> {
if (existing.has(email)) return err({ tag: "Duplicate", email })
return ok({ id: Math.random().toString(36).slice(2) })
}Abläufe komponieren
Verketten Sie Validierungen mit flatMap. Verwenden Sie einen switch mit einer never-Prüfung, um Vollständigkeit zur Compile-Zeit zu erzwingen.
export function createUser(flowEmail: string) {
return flatMap(validateEmail(flowEmail), email => saveUser(email))
}
// Use
const r = createUser("Ada@example.com")
if (r.ok) {
console.log("id:", r.value.id)
} else {
switch (r.error.tag) {
case "InvalidEmail": console.error("invalid email:", r.error.detail); break
case "Duplicate": console.error("already used:", r.error.email); break
default: ((x: never) => x)(r.error) // exhaustiveness
}
}Ausnahme → Result
Fangen Sie an E/A-Grenzen Ausnahmen ab und wandeln Sie sie in Result um. So haben Aufrufer einen einzigen Fehlerpfad, den sie behandeln müssen.
export async function fromPromise<T>(p: Promise<T>): Promise<Result<T, { tag: "Exception"; message: string }>> {
try { return ok(await p) }
catch (e) { return err({ tag: "Exception", message: e instanceof Error ? e.message : String(e) }) }
}
// Example: wrap a fetch
export async function fetchJson<T>(url: string): Promise<Result<T, { tag: "Exception"; message: string }>> {
return fromPromise(fetch(url).then(r => r.json() as T))
}Tipps zur HTTP-Zuordnung
HTTP-Integration: Ordnen Sie Domänenfehler 400/409 und E/A-Ausnahmen 502/503 zu. Halten Sie die Mapper-Funktion klein, damit Controller übersichtlich und vorhersehbar bleiben.
Prüfung des Result-Vorteils
Schnellprüfung: Warum sollten Sie eine diskriminierte Result-Union bevorzugen?
Zusammenfassung
Zusammenfassung: Definieren Sie einen kleinen Result-Typ, komponieren Sie ihn mit map/flatMap, modellieren Sie Domänenfehler als Unions und wandeln Sie Ausnahmen an den Grenzen um.
Häufig gestellte Fragen
Ist die Lektion „Result-/Either-ähnliche Typen“ kostenlos?
Ja — der vollständige Text von „Result-/Either-ähnliche Typen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des TypeScript Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der TypeScript Academy-Kurs umfasst insgesamt 2 Lektionen.
Was lerne ich in „Result-/Either-ähnliche Typen“?
Modellieren Sie Erfolg und Fehlschlag explizit mit einer Result-/Either-Union, ergänzen Sie Hilfsfunktionen (map/flatMap/mapError) und halten Sie Abläufe ohne try/catch überall vorhersehbar. Du übst TypeScript Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um TypeScript Academy zu starten?
Keine Vorkenntnisse erforderlich. TypeScript Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 2.
Wie lange dauert die Lektion „Result-/Either-ähnliche Typen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser TypeScript Academy-Lektion Code schreiben und ausführen?
Ja. Jede TypeScript Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Result-/Either-ähnliche Typen
- Vollständige Fehlerbehandlung mit diskriminierten Unions