TypeScript never erklärt: Exhaustive Checks, assertNever, Conditional Types und warum never KI generierten Code absichert. Praxiswissen von NCA
Mehr erfahren
type Id = string | number;
type Status = "entwurf" | "pruefung" | "online";
let status: Status = "online";
status = "archiviert"; // Fehler: Wert ist nicht erlaubt
Ein Tag inhouse mit Benjamin Klein für Developer, Tester und Admins. Context Engineering, Harness, ADRs und zwei Hands on Blöcke mit KI Agenten in eurem Setup.
In Astro, React und Vue Projekten sitzen die meisten Union Types dort, wo Daten zu Oberfläche werden: Ladezustände, Varianten, API Antworten. Beim Umstieg auf den strict Mode stoßen wir oft auf Objekte voller optionaler Felder. Genau dort lohnt der Umbau.
Wir modellieren solche Zustände mit dir neu und sichern sie mit dem never Type ab. Im Vibe Coding Consulting kommen die passenden Regeln für KI Agents dazu. Bei größeren Altlasten hilft Vibe Coding Projekt retten.
type Zustand = {
laedt: boolean;
daten?: string[];
fehler?: string;
};
// Alles gültig, das meiste davon Unsinn
const a: Zustand = { laedt: true, daten: [], fehler: "Timeout" };
const b: Zustand = { laedt: false };
type Zustand =
| { status: "laedt" }
| { status: "fertig"; daten: string[] }
| { status: "fehler"; meldung: string };
function anzeigen(zustand: Zustand): string {
if (zustand.status === "fehler") {
return zustand.meldung; // hier gibt es meldung
}
if (zustand.status === "fertig") {
return zustand.daten.join(", "); // hier gibt es daten
}
return "Lädt";
}
Daten und Fehler können jetzt nicht mehr gleichzeitig existieren. Ein Zugriff auf daten ohne Prüfung ist ein Compilerfehler. Damit auch kein neuer Fall vergessen wird, gehört ans Ende ein Exhaustive Check mit never.
const ROLLEN = ["admin", "redaktion", "gast"] as const;
type Rolle = (typeof ROLLEN)[number];
// "admin" | "redaktion" | "gast"
ROLLEN.forEach((rolle) => console.log(rolle));
A union type is a type formed from two or more other types
TypeScript never erklärt: Exhaustive Checks, assertNever, Conditional Types und warum never KI generierten Code absichert. Praxiswissen von NCA
Mehr erfahrenEin Agent orientiert sich an den Typen, die er im Projekt vorfindet. Ist ein Zustand klar als Union beschrieben, hat er weniger Raum für falsche Annahmen, und der Compiler meldet ihm jeden Griff ins Leere. Die Regel dazu gehört in die AI Coding Guidelines für TypeScript, geprüft wird sie über die Quality Gates für KI Code.
Wie du eine Union im Code eingrenzt, zeigen die Type Guards. Für Konfiguration im Code passt dazu satisfies, für fremde Daten unknown und Zod. Den Überblick zur Sprache gibt der TypeScript Eintrag.
Optimieren Sie Ihre Webseite mit Astro JS und nutzen Sie die Vorteile einer schnellen, sicheren und barrierefreien Webseite. Erfüllen Sie die gesetzlichen Anforderungen und verbessern Sie die Benutzererfahrung Ihrer Webseite. Mit Astro JS können Sie die Ladezeit reduzieren, die Sicherheit maximieren und die SEO-Optimierung verbessern. Kontaktieren Sie uns, um mehr zu erfahren und um Ihre Webseite auf ein neues Level zu heben.
Ein Union Type erlaubt einen Wert aus mehreren möglichen Typen, geschrieben mit dem senkrechten Strich, etwa string | number. Vor einer Prüfung darfst du nur nutzen, was alle Typen gemeinsam haben. Danach kennt der Compiler den konkreten Fall.
Eine Union aus Objekten, die ein gemeinsames Feld mit festem Wert haben, zum Beispiel status. Prüfst du dieses Feld, weiß der Compiler, welche weiteren Felder vorhanden sind. So lassen sich Zustände sauber trennen, die sonst über optionale Felder vermischt würden.
Für feste Werte reicht meist eine Literal Union, denn sie erzeugt keinen Laufzeitcode. Brauchst du die Werte auch als Liste, passt ein Objekt oder Array mit as const. Enums bleiben sinnvoll, wenn bestehender Code schon damit arbeitet und ein Umbau wenig bringt.
Eine Union heißt entweder das eine oder das andere. Eine Intersection mit dem Und Zeichen heißt beides zugleich. Bei Objekten vereint eine Intersection die Felder. Widersprechen sich zwei Typen, etwa string und number, ergibt die Intersection never.
Ja, weil sie die erlaubten Werte festlegen. Erfindet ein Agent einen Status, meldet der Compiler das sofort. Vergisst er einen Fall, greift der Exhaustive Check. Beides liefert ihm Feedback, das er selbst lesen und noch im selben Lauf beheben kann.
Der Compiler weiß vor einer Prüfung nicht, welcher Fall vorliegt. Ein Feld, das nur in einem Fall existiert, könnte also fehlen. Grenze den Typ erst ein, etwa über das Unterscheidungsfeld oder typeof. Danach ist der Zugriff erlaubt.
Eine feste Grenze gibt es für den Alltag nicht. Entscheidend ist die Lesbarkeit. Wächst eine Union stark und wird an vielen Stellen behandelt, lohnt ein Blick auf die Struktur. Oft lassen sich Fälle gruppieren oder in einem Mapping statt in vielen switch Blöcken abbilden.
Ein optionales Feld kann fehlen, und beim Lesen hat es dann den Wert undefined. Im strict Mode zwingt dich der Compiler, das zu prüfen. Einzelne optionale Felder sind völlig in Ordnung. Heikel wird es, wenn mehrere davon voneinander abhängen.
Suche nach Objekten mit Flags wie laedt oder istFehler. Definiere die echten Zustände als Union mit einem status Feld und ändere zuerst den Typ. Der Compiler zeigt dir danach alle betroffenen Stellen, die du Schritt für Schritt anpasst.
Nein, Typen existieren nur beim Kompilieren. Liefert eine API einen unbekannten Status, merkt der Compiler das nicht. An der Systemgrenze brauchst du deshalb eine Validierung zur Laufzeit. Dahinter arbeitet deine Anwendung mit der geprüften Union.