logo hsb.horse
← Zur Snippets-Übersicht

Snippets

TypeScript Non-null Assertion

TypeScript-Typ-Guard-Funktionen zur Eliminierung von undefined und null. Sicherstellung sowohl von Laufzeitfehlern als auch von Typsicherheit.

Veröffentlicht: Aktualisiert:

Beim Zugriff auf externe APIs oder Array-Indizes können Werte undefined werden, was sie typtechnisch schwierig handhabbar macht. Verwenden Sie Non-null-Assertionen, um sowohl Laufzeitprüfungen als auch Type-Narrowing zu erreichen.

Code

function assertIsDefined<T>(value: T): asserts value is NonNullable<T> {
if (value === undefined || value === null) {
throw new Error(`Expected 'value' to be defined, but received ${value}`);
}
}
function nonNull<T>(value: T): NonNullable<T> {
assertIsDefined(value);
return value;
}

Nutzungsbeispiele

Sicherer Zugriff auf Array-Elemente

const arr = [1, 2, 3];
const value = arr[10]; // number | undefined
// Typfehler kann nicht vermieden werden
console.log(value.toFixed()); // Error: Object is possibly 'undefined'
// Verwendung von nonNull
const safeValue = nonNull(arr[10]);
// Wird als NonNullable<number> inferiert
console.log(safeValue.toFixed()); // OK

API-Antwortvalidierung

interface User {
name: string;
}
async function getUser(id: string): Promise<User> {
const response = await fetch(`/api/users/${id}`);
const user = await response.json() as User | undefined;
// Fehler wenn Antwort leer ist
assertIsDefined(user);
// user kann an diesem Punkt als User-Typ behandelt werden
return user;
}

Unterschied zum !-Operator

TypeScript hat einen Non-null-Assertion-Operator value!, aber dieser führt keine Laufzeitprüfungen durch. Die Verwendung von Assertion-Funktionen ermöglicht es, Werte zur Laufzeit zu validieren und gleichzeitig den Typ einzugrenzen.

Vorsichtsmaßnahmen

Verwenden Sie Assertion-Funktionen nur, wenn Sie sicher sind, dass ein Wert wirklich existiert. Nachlässige Verwendung führt zu Laufzeitfehlern. Besonders beim Array-Index-Zugriff sollten Sie vorher die Länge prüfen.