Читать книгу Angular - Manfred Steyer - Страница 48

Strikte Null-Prüfungen

Оглавление

So gut wie jede Sprache bietet Nullwerte, um anzuzeigen, dass für eine Variable kein Wert vorliegt. JavaScript und TypeScript bieten daneben sogar noch den Wert undefined. Dieser informiert darüber, dass die gewünschte Eigenschaft gar nicht vorhanden ist. Versucht der Programmcode, eine Eigenschaft oder Methode bei einer Variablen mit dem Wert null oder undefined zu nutzen, ergibt sich ein Laufzeitfehler. Da standardmäßig jede Variable diese Werte aufnehmen kann, müsste streng genommen der Programmcode mit Prüfungen sicherstellen, dass der gewünschte Zugriff sicher ist. Beispiel 2-29 veranschaulicht das anhand des in diesem Kapitel verwendeten FlightManager:

Beispiel 2-29: Auf Nullwerte prüfen

// src/app/ts/flight-manager.ts

import { Flight } from '../flight';

export class FlightManager {

private cache: Flight[];

constructor(cache: Flight[]) {

if (!cache) throw Error('null or undefined is not allowed!');

this.cache = cache;

}

[...]

}

Hier prüft der Konstruktor den übergebenen cache auf null bzw. undefined. Streng genommen, prüft er, ob der Wert falsy ist, was null und undefined inkludiert (siehe den Abschnitt »boolean« auf Seite 42). Damit verhindert das Beispiel, dass die Methode search beim Iterieren des Caches auf einen Fehler läuft, wenn der Cache einen Nullwert aufweist.

Leider führt diese Prüfung nur dazu, dass die falsche Verwendung des FlightManager etwas früher zur Laufzeit entdeckt wird. Wünschenswert wäre es jedoch, solche Fehler schon beim Kompilieren ausschließen zu können. Hierzu bietet TypeScript strikte Null-Prüfungen (Strict Null Checks).

Da die Angular CLI standardmäßig den Strict Mode aktiviert, kommen wir auch automatisch in den Genuss der Strict Null Checks. Um sie zu deaktivieren, könnten Sie die Eigenschaft strictNullChecks in der tsconfig.json auf false setzen:

{

'compilerOptions': {

[...]

'strictNullChecks': true

}

}

Wir wollen es hier jedoch damit belassen. Bei Nutzung dieser Option können typisierte Variablen standardmäßig weder den Wert null noch undefined aufnehmen. Um dennoch diese Werte zuweisen zu können, muss die Deklaration das explizit erlauben. Der Aufruf

let fm = new FlightManager(null);

provoziert somit einen Compilerfehler. Um wieder Nullwerte zuzulassen, sind sogenannte Union-Types zu nutzen. Dabei handelt es sich um ein Sprachkonstrukt von TypeScript, das vorgibt, dass eine Variable einen von mehreren Typen aufweisen muss. Die Zeile

let stringOrNumber: string | number;

deklariert beispielsweise eine Variable, die sowohl einen String als auch eine Zahl aufnehmen kann.

Auf die gleiche Weise lassen sich die Werte null und undefined in den Wertebereich einer Variablen aufnehmen. Allerdings sind in diesem Fall wieder die eingangs erwähnten Prüfungen nötig. Beispiel 2-30 veranschaulicht das und kompensiert das Fehlen des Caches mit einem leeren Array:

Beispiel 2-30: Die Werte null und undefined in den Wertebereich aufnehmen

// src/app/ts/flight-manager.ts

import { Flight } from '../flight';

export class FlightManager {

private cache: Flight[];

constructor(cache: Flight[] | null | undefined) {

if (!cache) {

cache = [];

}

this.cache = cache;

}

[...]

}

In diesem Fall würde der Compiler ohne Null-Prüfung sogar einen Fehler auslösen, da this.cache weder null noch undefined aufnehmen kann.

Angular

Подняться наверх