unknown vs any in TypeScript: warum any die Prüfung abschaltet, wie unknown Narrowing erzwingt, mit Praxisbeispielen und Regeln für KI Code von NCA
Mehr erfahren
function polster(wert: string | number): string {
if (typeof wert === "number") {
return " ".repeat(wert); // hier ist wert number
}
return wert; // hier ist wert string
}
Besonders wichtig ist das bei unknown und bei Union Types. Ohne Prüfung lässt der Compiler dort kaum Zugriffe zu.
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.
Wo in einer Codebasis viele as stehen, fehlen fast immer Type Guards. Im Codebase Audit für KI generierten Code suchen wir genau diese Stellen und ersetzen Behauptungen durch echte Prüfungen. Im Frontend Development gehört das bei uns zum normalen Handwerk.
Dazu richten wir mit dir einen strict Mode ein, der die Lücken sichtbar macht. Die Prüfung läuft dann als eigener Schritt in deinen CI CD Pipelines. Dasselbe Denken kennst du aus PHP von PHPStan.
function ausgabe(werte: string[] | null) {
if (typeof werte === "object") {
for (const wert of werte) {} // Fehler: werte ist möglicherweise null
}
}
function menge(anzahl: number | null): number {
if (anzahl) return anzahl;
return 1; // auch bei anzahl === 0
}
// Besser, wenn 0 ein gültiger Wert ist
function mengeSicher(anzahl: number | null): number {
return anzahl ?? 1;
}
type Artikel = { titel: string; preis: number | null };
type MitPreis = Artikel & { preis: number };
function hatPreis(artikel: Artikel): artikel is MitPreis {
return artikel.preis !== null;
}
const summe = artikel
.filter(hatPreis)
.reduce((gesamt, a) => gesamt + a.preis, 0);
function sicherString(wert: unknown): asserts wert is string {
if (typeof wert !== "string") {
throw new Error("String erwartet");
}
}
const eingabe: unknown = lese();
sicherString(eingabe);
eingabe.trim(); // eingabe ist jetzt string
Für einzelne Werte reicht das völlig. Bei ganzen Objekten aus dem Netz wird Handarbeit schnell lang und fehleranfällig, dort übernimmt ein Schema wie Zod.
the process of refining types to more specific types than declared is called narrowing
unknown vs any in TypeScript: warum any die Prüfung abschaltet, wie unknown Narrowing erzwingt, mit Praxisbeispielen und Regeln für KI Code von NCA
Mehr erfahrenKI Agents lösen Typfehler gern mit einer Assertion, weil der Fehler damit verschwindet. Im Review fragen wir deshalb bei jedem as nach der Prüfung dahinter. Die passende Regel steht in den AI Coding Guidelines für TypeScript und in der AGENTS.md.
Die meisten Guards arbeiten auf Union Types. Was danach mit vollständig eingegrenzten Typen passiert, zeigt der never Type. Geprüfte Konfiguration ohne Assertion liefert satisfies. Mehr zur Sprache steht im 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 Type Guard ist eine Prüfung, aus der der Compiler einen genaueren Typ ableitet. Dazu zählen typeof, instanceof, der in Operator und Vergleiche. Im passenden Zweig kennt TypeScript dann den konkreten Typ und erlaubt die zugehörigen Zugriffe.
Narrowing ist das Eingrenzen eines breiten Typs auf einen engeren. Aus string | number wird nach einer Prüfung zum Beispiel string. Der Compiler verfolgt dafür den Ablauf deines Codes, also Bedingungen, Schleifen, frühe Rücksprünge und Zuweisungen.
Ein Type Guard prüft den Wert zur Laufzeit. Eine Assertion mit as behauptet nur etwas und erzeugt keinen Code. Liegt die Behauptung falsch, knallt es erst später an einer anderen Stelle. Wo es geht, ist die Prüfung deshalb die bessere Wahl.
Du schreibst eine Funktion mit dem Rückgabetyp wert is Typ. Sie liefert true oder false, und der Compiler überträgt das Ergebnis auf den Aufrufer. Beachte, dass er den Inhalt der Prüfung nicht kontrolliert. Für die Richtigkeit bist du selbst verantwortlich.
Ja, weil sie Behauptungen durch Prüfungen ersetzen. Agents greifen bei Typfehlern gern zu as oder any. Eine Regel, die stattdessen Type Guards verlangt, macht ihre Annahmen sichtbar. Laufzeitfehler treten dann an der geprüften Stelle auf statt irgendwo im Programm.
Bei einer Variable mit let kann sich der Wert ändern, bevor der Callback läuft. Der Compiler vertraut der früheren Prüfung deshalb nicht immer. Meist hilft es, den Wert vorher in einer const Variable zu speichern.
Er zeigt nur, dass ein Feld vorhanden ist, nicht welchen Typ es hat. Innerhalb deines eigenen Codes genügt das oft, etwa zum Unterscheiden zweier Typen. Bei fremden Daten musst du auch die Werte prüfen, am einfachsten mit einem Schema.
Eine Funktion mit dem Rückgabetyp asserts wert is Typ. Sie wirft einen Fehler, wenn die Prüfung fehlschlägt, und ansonsten gilt der engere Typ im weiteren Block. Das passt gut für Bedingungen, ohne die der restliche Code nicht sinnvoll laufen kann.
Ja, ein wenig, denn anders als Typen bleiben sie als JavaScript erhalten. Einfache Prüfungen wie typeof fallen praktisch nicht ins Gewicht. Eine Schema Validierung großer Datenmengen kostet mehr und gehört deshalb an die Systemgrenze, nicht in jede Schleife.
Das lohnt sich, sobald eine Prüfung mehr als eine Bedingung hat. Der Compiler verlässt sich auf deine Funktion, ein Fehler darin bleibt also unsichtbar. Ein kurzer Unit Test mit gültigen und ungültigen Werten sichert die Annahme ab.