Diskriminierte Unions erstellen
Kennzeichnen Sie Union-Mitglieder mit einer gemeinsamen diskriminierenden Eigenschaft.
Diskriminierte Unions erstellen ist eine kostenlose TypeScript Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. 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 4 Lektionen.
Was ist eine diskriminierte Union?
Eine diskriminierte Union ist eine Union von Objekttypen, die alle eine gemeinsame literal-Eigenschaft namens Diskriminante besitzen. Anhand dieses gemeinsamen Tags kann TypeScript die Mitglieder unterscheiden.
// The shared "kind" property is the discriminant
type Circle = { kind: "circle"; radius: number };
type Square = { kind: "square"; side: number };
type Shape = Circle | Square;Die Diskriminanten-Eigenschaft
Die Diskriminante muss ein Literaltyp sein, etwa "circle", und darf kein weiter Typ wie string sein. Jedes Mitglied erhält seinen eigenen eindeutigen Literalwert.
type Circle = { kind: "circle"; radius: number };
type Square = { kind: "square"; side: number };
const c: Circle = { kind: "circle", radius: 10 };
console.log(c.kind); // "circle"Jedes Mitglied hat eigene Felder
Zusätzlich zur gemeinsamen Diskriminante enthält jedes Mitglied die Felder, die nur für dieses Mitglied sinnvoll sind. Ein Kreis hat einen radius, ein Quadrat eine side.
type Circle = { kind: "circle"; radius: number };
type Square = { kind: "square"; side: number };
type Rectangle = { kind: "rectangle"; width: number; height: number };
type Shape = Circle | Square | Rectangle;Union-Werte erstellen
Beim Erstellen eines Werts überprüft TypeScript anhand von kind, ob seine Struktur genau einem Mitglied der Union entspricht.
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; side: number };
const shapes: Shape[] = [
{ kind: "circle", radius: 5 },
{ kind: "square", side: 4 }
];
console.log(shapes.length); // 2Warum nicht einfach optionale Felder?
Ein unpräziser Typ mit optionalen Feldern (radius?, side?) erlaubt ungültige Kombinationen. Eine diskriminierte Union macht ungültige Zustände nicht darstellbar.
// Loose and error-prone: nothing stops radius + side together
type BadShape = { radius?: number; side?: number };
const bad: BadShape = { radius: 5, side: 4 }; // nonsense, but allowedDer Name der Diskriminante ist frei wählbar
Das Tag heißt üblicherweise kind oder type, aber jeder Name ist möglich, solange jedes Mitglied denselben Eigenschaftsnamen mit einem unterschiedlichen Literalwert verwendet.
type Event =
| { type: "click"; x: number; y: number }
| { type: "scroll"; delta: number };
const e: Event = { type: "click", x: 10, y: 20 };
console.log(e.type); // "click"Einen Rechner für die Fläche von Formen modellieren
Diskriminierte Unions sind besonders nützlich, wenn jede Variante eine andere Verarbeitung benötigt. Hier richten wir Formen ein, die später von einer Flächenfunktion verarbeitet werden.
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; side: number };
const myShapes: Shape[] = [
{ kind: "circle", radius: 3 },
{ kind: "square", side: 6 }
];
console.log("Count:", myShapes.length);Eine dritte Variante hinzufügen
Unions lassen sich problemlos erweitern. Das Hinzufügen eines triangle-Mitglieds erfordert nur eine Änderung in einer Zeile, und TypeScript verfolgt es überall dort, wo die Union verwendet wird.
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; side: number }
| { kind: "triangle"; base: number; height: number };
const t: Shape = { kind: "triangle", base: 4, height: 8 };
console.log(t.kind);Eindeutige Literale verhindern Überschneidungen
Da jedes kind eindeutig ist, gibt es keine Mehrdeutigkeit. Ein Wert ist genau ein Mitglied und niemals zwei gleichzeitig.
type A = { kind: "a"; value: number };
type B = { kind: "b"; label: string };
type Union = A | B;
function describe(u: Union) {
return u.kind === "a" ? u.value : u.label;
}
console.log(describe({ kind: "b", label: "hi" }));Diskriminanten mit booleschen Tags
Die Diskriminante muss kein String sein. Auch ein boolean-Literal funktioniert und ist praktisch für Erfolgs- und Fehlerergebnisse.
type Result =
| { ok: true; data: string }
| { ok: false; error: string };
const r: Result = { ok: true, data: "loaded" };
console.log(r.ok ? r.data : r.error);Diskriminierte Unions in der Praxis
Sie verfügen nun über ein vollständiges Modell für Formen. In der nächsten Lektion werden wir anhand der Diskriminante eingrenzen, um sicher auf die spezifischen Felder jedes Mitglieds zuzugreifen.
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; side: number };
const sample: Shape = { kind: "circle", radius: 7 };
console.log(sample.kind, "ready");Kurze Überprüfung: Diskriminanten
Testen Sie Ihr Verständnis diskriminierter Unions.
Zusammenfassung: Diskriminierte Unions erstellen
Sie haben gelernt, dass eine diskriminierte Union Objekttypen verbindet, die eine Literal-Diskriminante wie kind gemeinsam haben. Jedes Mitglied enthält seine eigenen Felder, eindeutige Literale verhindern Überschneidungen, und dieses Muster macht ungültige Zustände nicht darstellbar.
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; side: number };
const done: Shape = { kind: "square", side: 2 };
console.log("Recap complete:", done.kind);Lerne TypeScript mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 101
- Lektionen
- 352
Häufig gestellte Fragen
Ist die Lektion „Diskriminierte Unions erstellen“ kostenlos?
Ja — der vollständige Text von „Diskriminierte Unions erstellen“ 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 4 Lektionen.
Was lerne ich in „Diskriminierte Unions erstellen“?
Kennzeichnen Sie Union-Mitglieder mit einer gemeinsamen diskriminierenden Eigenschaft. 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 4.
Wie lange dauert die Lektion „Diskriminierte Unions erstellen“?
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
- Diskriminierte Unions erstellen
- Einschränkung anhand des Diskriminators
- Vollständigkeitsprüfung mit never
- Zustandsautomaten modellieren