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 werdenconsole.log(value.toFixed()); // Error: Object is possibly 'undefined'
// Verwendung von nonNullconst safeValue = nonNull(arr[10]);// Wird als NonNullable<number> inferiertconsole.log(safeValue.toFixed()); // OKAPI-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.
hsb.horse