NCA Social Media
Aktualisiert:
Autor:
Roland Golla
Grüne Straße verengt sich an Schranke mit gelbem Schild TYPE GUARDS

Was sind Type Guards in TypeScript?

Type Guards sind Prüfungen im Code, aus denen TypeScript den genaueren Typ eines Werts ableitet. Das Eingrenzen selbst heißt Narrowing. Du schreibst normales JavaScript, und der Compiler verfolgt mit, was in jedem Zweig möglich ist.
Code:
          

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.

Inhalt
NCA KI Workshop für Developer

Agentic Coding im Team, nicht nur im Glossar

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.

  1. 1
    Kostenloses Vorgespräch
    Stand, Rollen und Ziele klären
  2. 2
    Workshoptag bei euch
    Praxis am Vormittag, Hands on danach
  3. 3
    Praxistag optional
    Agenten im eigenen Projekt
Benjamin Klein
Benjamin Klein
Senior Consultant
Zum Workshop für Developer arrow_forward

NCA hilft dir, unsichere Casts loszuwerden

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.

Diese Type Guards versteht der Compiler von selbst

Prüfung Passt für Beispiel
typeof Primitive wie string, number, boolean typeof wert === "string"
instanceof Klassen, Date, Error wert instanceof Date
in Objekte mit unterschiedlichen Feldern "email" in wert
Vergleich null und feste Werte wert !== null
Array.isArray Arrays Array.isArray(wert)

Zwei Fallen beim Narrowing erwischen fast jedes Team

Fall 1: typeof null. In JavaScript liefert typeof null den Text object. Eine reine Prüfung auf object lässt null also durch, und der Compiler sagt dir das zum Glück auch.
Code:
          

function ausgabe(werte: string[] | null) {
  if (typeof werte === "object") {
    for (const wert of werte) {} // Fehler: werte ist möglicherweise null
  }
}

Fall 2: die Prüfung auf wahr. Ein einfaches if (text) schließt null und undefined aus, aber auch den leeren String. Bei Zahlen fällt die 0 heraus. Der Compiler meldet das nicht, weil der Code gültig ist.
Code:
          

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;
}

Eigene Prüfungen schreibst du mit einem Type Predicate

Packst du eine Prüfung in eine Funktion, gibt sie für den Compiler zunächst nur boolean zurück. Mit dem Rückgabetyp wert is Typ überträgt sich das Wissen zurück an den Aufrufer. So lassen sich auch Listen sauber filtern.
Code:
          

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);

Ein Punkt verdient Vorsicht: Der Compiler kontrolliert nicht, ob dein Prädikat stimmt. Prüfst du zu wenig, behauptest du am Ende doch wieder etwas. Solche Funktionen sind deshalb gute Kandidaten für einen Unit Test.

Assertion Functions brechen bei falschen Werten ab

Manchmal soll der Code bei einem falschen Wert gar nicht weiterlaufen. Dafür gibt es asserts wert is Typ. Die Funktion wirft einen Fehler, und danach gilt der engere Typ für den Rest des Blocks.
Code:
          

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

TypeScript Handbook, Offizielle TypeScript Dokumentation von Microsoft – typescriptlang.org, Kapitel Narrowing

Ein as im Diff ist bei uns immer eine Nachfrage wert

KI 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.

CYPRESS.IO Ambassador und IT Consultant für QA Engenieering und Qualität in PHP Projekten.
Frontend: Optimieren Sie Ihre Webseite mit Astro JS und nutzen Sie die Vorteile der Barrierefreiheit

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.

Häufige Fragen zu Type Guards und Narrowing

Das fragen Teams bei Type Guards im Projektalltag am häufigsten.
Was ist ein Type Guard in TypeScript 2026?

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.

Was bedeutet Narrowing 2026 in TypeScript?

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.

Was ist 2026 der Unterschied zwischen Type Guard und as?

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.

Wie schreibe ich 2026 einen eigenen Type Guard?

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.

Helfen Type Guards 2026 bei KI generiertem Code?

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.

Warum verliert TypeScript das Narrowing in einem Callback?

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.

Reicht ein in Operator für die Prüfung eines Objekts?

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.

Was ist eine Assertion Function?

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.

Kosten Type Guards Laufzeit?

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.

Muss ich eigene Type Guards testen?

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.