TypeScript unterstützt den Operator typeof nicht nur zur Laufzeit (wie in JavaScript), sondern auch zur Kompilierungszeit zur Ableitung des Typs eines Ausdrucks. Dies ermöglicht es, den Typ einer bereits deklarierten Variablen, Funktion oder Struktur zu erhalten, was die Typisierung flexibel macht und die Wahrscheinlichkeit von Duplizierung und Desynchronisation von Typen verringert.
Ursprünglich wurde der Operator typeof in JavaScript verwendet, um den Typ eines Wertes zur Laufzeit zu bestimmen. TypeScript hat diesen Mechanismus erweitert – jetzt erstellt typeof zur Kompilierungszeit einen Verweis auf den Typ des Wertes einer Variablen oder das Ergebnis einer Funktion. Dies ist äußerst nützlich beim Arbeiten mit komplexen Strukturen, Konfigurationen sowie bei der Wiederverwendung von Typen zwischen Modulen.
Bei der manuellen Typdeklaration ist es leicht, einen Fehler zu machen: die Strukturdefinition zu ändern und das type- oder interface-Deklaration nicht zu aktualisieren oder die Typen zwischen Objekten falsch zu kopieren. Dies führt zu Desynchronisation des Codes und Laufzeitfehlern. Bei der Verwendung von typeof wird der Typ dynamisch abgeleitet und entspricht immer der aktuellen Datenstruktur.
Um eine Variable mit einem Typ zu deklarieren, der der bereits bestehenden Struktur oder Konstante entspricht, wird der Operator typeof angewendet:
const config = { host: "localhost", port: 8080, }; let serverCfg: typeof config; // Typ von serverCfg ist identisch mit dem von config
Für die Typisierung einer Funktion, die eine bestimmte Struktur zurückgibt:
function makeUser() { return { id: 1, name: "Alex" }; } type User = ReturnType<typeof makeUser>; // User: {id: number; name: string;}
Wichtige Merkmale:
typeof in TS gibt den Typ des Wertes einer Variablen oder des Ergebnisses eines Ausdrucks zur Kompilierungszeit zurück.ReturnType, Parameters) sowie mit keyof kombiniert, um eine Liste der Schlüssel eines Objekts zu erhalten.Wird der Operator typeof in TypeScript zur Laufzeit ausgeführt?
Nein, der typisierte typeof funktioniert nur zur Kompilierungszeit und gelangt nicht in den Laufzeitcode, obwohl der JavaScript-Operator typeof auch zur Laufzeit existiert.
Kann typeof zur Ableitung des Typs von Klassen-Eigenschaften verwendet werden?
Ja, aber nur, wenn die Eigenschaft bereits als statisch oder mit einem Anfangswert deklariert wurde, andernfalls tritt ein Fehler auf. Bei private/public protected – werden nur öffentliche Eigenschaften/Methoden berücksichtigt.
Gibt es einen Unterschied zwischen 'let x: typeof y;' und 'let x = y;'?
Aus typischer Sicht wird in beiden Fällen der Typ automatisch vom Compiler abgeleitet. jedoch kann typeof verwendet werden, um Typdeklarationen ohne Initialisierung zu schreiben oder um komplexere Kombinationen mit utilitaristischen Typen zu erstellen.
typeof zur typischen js-Typüberprüfung typeof x === 'string' ist runtime und nicht ein compilierter Typ.Im Projekt wird ein großes Objekt für die Anwendungsparameter separat als Typ und separat als Variable beschrieben. Bei Änderungen der Struktur wird vergessen, den Typ zu aktualisieren, was zu API-Fehlern führt.
Vorteile: Flexible Arbeit mit Typen, Typen können über type oder interface überschrieben werden.
Nachteile: Hohe Gefahr von Desynchronisation der Struktur und Typen, schlechte Wartbarkeit.
Verwendung von typeof zur Erzeugung des aktuellen Typs der Objektstruktur bei der Deklaration neuer Variablen und bei der Generierung von Typen für die API-Schnittstelle.
Vorteile: Der Typ stimmt immer mit dem Wert überein, geringe Fehlerwahrscheinlichkeit, gute Autovervollständigung.
Nachteile: Wenn das Objekt sehr komplex ist, kann der endgültige Typ für Anfänger verwirrend zu lesen sein.