Domänentypen in TypeScript mit Discriminated Unions modellieren
Gestalte deine TypeScript-Domänentypen so um, dass unmögliche Zustände nicht kompilieren: Discriminated Unions, Branded IDs, erschöpfende Switches und Validierung an den Systemgrenzen. Entwickelt für ChatGPT, Claude, Gemini und Microsoft Copilot. Er enthält 3 anpassbare Variablen und lässt sich kostenlos mit einem Klick kopieren.
Experte · Code · Redaktionelle Prüfung ausstehend
Prompt
Arbeite als Experte für TypeScript und typgetriebenes Design, dem Klarheit wichtiger ist als Raffinesse.
Kontext:
- Domäne: {{domaene}}
- Aktuelle Typen (falls vorhanden): {{aktuelle_typen}}
- Einsatzort: {{einsatz}}
Wenn unklar ist, welche Zustandsübergänge gültig sind oder welche Felder es in welchem Zustand gibt, frag nach, bevor du entwirfst.
Liefere:
1. Eine Diagnose der aktuellen Typen: welche unmöglichen Kombinationen sie zulassen (etwa eine „versandte“ Bestellung ohne Versanddatum) und welche Bugs daraus entstehen können.
2. Das neue Modell: Unions, diskriminiert über ein Literal-Feld, Felder nur in dem Zustand, zu dem sie gehören, `readonly` wo sinnvoll und Branded Types für IDs, die nicht verwechselt werden dürfen.
3. Typisierte Übergangsfunktionen, die nur einen gültigen Ausgangszustand akzeptieren.
4. Einen erschöpfenden `switch` mit `never`-Prüfung und ein Beispiel für den Compilerfehler, der entsteht, wenn ein neuer Zustand nicht behandelt wird.
5. Validierung an den Systemgrenzen (API, Formulare, Speicher) mit einem Schema, aus dem der Typ abgeleitet wird, damit Typ und Validierung nicht auseinanderlaufen.
6. Typ-Tests mit `@ts-expect-error` oder `expectTypeOf`, die zeigen, dass unmögliche Zustände nicht kompilieren.
7. Wann dieses Modell übertrieben ist und etwas Einfacheres genügt.
Vorgaben:
- Bevorzuge Literal-Unions statt `enum`, es sei denn, du begründest, warum ein Enum hier besser ist.
- Keine komplexen Conditional Types oder Generics ohne klaren Nutzen; ein Entwickler mit mittlerer Erfahrung muss den Code lesen können.
- Erfinde keine Geschäftsregeln: Markiere die zu bestätigenden mit [AUSFÜLLEN].
Format: Diagnose, Codeblöcke mit Dateinamen und eine Tabelle der Zustände und Übergänge.So verwenden Sie ihn
- Beschreibe die echten Zustände deiner Entität und welche Daten jeder hat. 2. Füge die aktuellen Typen ein, falls vorhanden. 3. Ersetze die Typen schrittweise und lass dir vom Compiler zeigen, welche Stellen angepasst werden müssen.
Anwendungsbeispiel
Domäne: Bestellungen eines Onlineshops mit den Zuständen offen, bezahlt, versandt, zugestellt und storniert · Aktuelle Typen: Interface Bestellung mit lauter optionalen Feldern · Einsatz: UI-State und API-Antworten.
Beispielergebnis
Diagnose
status: string mit optionalen Feldern erlaubt unmögliche Kombinationen: eine 'versandt'-Bestellung ohne sendungsnummer oder eine 'storniert'-Bestellung mit bezahltAm, aber ohne Grund. Jede Komponente verteilt am Ende überall ?..
bestellung.ts
export type BestellungId = string & { readonly __marke: 'BestellungId' };
type Basis = { readonly id: BestellungId };
export type Bestellung =
| (Basis & { status: 'offen' })
| (Basis & { status: 'bezahlt'; bezahltAm: Date })
| (Basis & { status: 'versandt'; bezahltAm: Date; sendungsnummer: string })
| (Basis & { status: 'zugestellt'; bezahltAm: Date; sendungsnummer: string })
| (Basis & { status: 'storniert'; stornogrund: string });
type ImStatus<S extends Bestellung['status']> = Extract<Bestellung, { status: S }>;
export function versenden(bestellung: ImStatus<'bezahlt'>, sendungsnummer: string): ImStatus<'versandt'> {
return { ...bestellung, status: 'versandt', sendungsnummer };
}
export function bezeichnung(bestellung: Bestellung): string {
switch (bestellung.status) {
case 'offen': return 'Zahlung ausstehend';
case 'bezahlt': return 'Bezahlt';
case 'versandt': return `Versandt (${bestellung.sendungsnummer})`;
case 'zugestellt': return 'Zugestellt';
case 'storniert': return `Storniert: ${bestellung.stornogrund}`;
default: {
const vollstaendig: never = bestellung;
return vollstaendig;
}
}
}
Kommt morgen 'retourniert' hinzu und wird nicht behandelt, kompiliert die never-Zeile nicht mehr. Zu klären: Darf eine bezahlte Bestellung storniert werden? [AUSFÜLLEN] …
Wichtige Fakten
- Kategorie
- Programmierung & Entwicklung · TypeScript
- Ausgabetyp
- Code
- Niveau
- Experte
- Entwickelt für
- ChatGPT, Claude, Gemini und Microsoft Copilot
- Verifiziert in
- Redaktionelle Prüfung ausstehend
- Variablen
- Domäne, Aktuelle Typen und Einsatzort
- Sprache
- Deutsch
- Preis
- Kostenlos, ohne Anmeldung
- Aktualisiert
- 07.11.2026
Häufig gestellte Fragen
Was ist eine Discriminated Union?
Ein Typ aus mehreren Varianten mit einem gemeinsamen Literal-Feld, etwa status: „bezahlt“ oder „versandt“. TypeScript erkennt über dieses Feld, welche weiteren Felder in jeder Variante existieren.
Wozu dienen Branded Types bei IDs?
Der Compiler lehnt dann eine KundenId ab, wo eine BestellId erwartet wird, obwohl beide Strings sind. So vermeidest du stille Fehler, die im Code-Review leicht übersehen werden.
Wofür ist dieser Prompt gedacht?
Gestalte deine TypeScript-Domänentypen so um, dass unmögliche Zustände nicht kompilieren: Discriminated Unions, Branded IDs, erschöpfende Switches und Validierung an den Systemgrenzen.
Mit welchen KI-Tools funktioniert er?
Er ist für ChatGPT, Claude, Gemini und Microsoft Copilot entwickelt. Wir haben ihn in diesen Tools noch nicht überprüft, daher können die Ergebnisse variieren.
Wie passe ich den Prompt an?
Klicken Sie auf „Anpassen“ und füllen Sie die Variablen aus (Domäne, Aktuelle Typen und Einsatzort). Der Text wird sofort aktualisiert und lässt sich anschließend mit einem Klick kopieren. Die Werte werden nur in Ihrem Browser gespeichert.
Brauche ich Erfahrung, um ihn zu verwenden?
Er ist für Experten: Er richtet sich an Personen mit Erfahrung im Thema, die das Ergebnis beurteilen und anpassen können.
Ist dieser Prompt kostenlos?
Ja. Jeder Prompt von HomeCasa Prompts ist kostenlos, ohne Anmeldung und ohne Abonnement. Sie können ihn auch in beruflichen Projekten verwenden.
Kann ich der KI-Ausgabe vertrauen?
Betrachten Sie sie als hochwertigen Entwurf: Prüfen Sie Daten, Zahlen und wichtige Aussagen immer, bevor Sie etwas veröffentlichen oder Entscheidungen treffen.