Einführung in Node.js, Folge 24: Let's code (typedescriptor)
Der typeof-Operator von JavaScript hat einige Schwächen: Er kann beispielsweise nicht zwischen Objekten und Arrays unterscheiden und identifiziert null fälschlicherweise als Objekt. Abhilfe schafft ein eigenes Modul, das Typen verlässlich identifiziert und beschreibt.
- Golo Roden
Der typeof-Operator von JavaScript hat einige Schwächen: Er kann beispielsweise nicht zwischen Objekten und Arrays unterscheiden und identifiziert null fälschlicherweise als Objekt. Abhilfe schafft ein eigenes Modul, das Typen verlässlich identifiziert und beschreibt.
Das Typsystem von JavaScript ist eigentlich verhältnismäßig einfach zu verstehen: Es gibt lediglich acht Datentypen, die jeweils eine klare Aufgabe haben. Leider gibt es allerdings die ein oder andere historisch bedingte Unschärfe, die das Arbeiten mit dem Typsystem teilweise unnötig erschwert.
Einführung in Node.js
- Folge 1: Node.js installieren
- Folge 2: Erste Schritte
- Folge 3: Module verwenden
- Folge 4: Web-APIs entwickeln
- Folge 5: Middleware
- Folge 6: Auf das Dateisystem zugreifen
- Folge 7: Callbacks verstehen
- Folge 8: Events auslösen und verarbeiten
- Folge 9: Datenbanken ansprechen (NoSQL)
- Folge 10: Praxisbeispiel
- Folge 11: Code analysieren
- Folge 12: Unit-Tests schreiben
- Folge 13: HTTPS und HTTP/2
- Folge 14: Websockets
- Folge 15: Integration-Tests schreiben
- Folge 16: Node.js und Docker
- Folge 17: Streams verwenden
- Folge 18: Eigene Streams schreiben
- Folge 19: Dokumentation schreiben
- Folge 20: Praxisbeispiel
- Folge 21: Daten verschlüsseln
- Folge 22: CLI-Anwendungen
- Folge 23: Child-Prozesse
- Folge 24: Let's code (typedescriptor)
So verfügt JavaScript beispielsweise über einen eigenen Typ für den Wert null, den sogenannten Null-Type. Versucht man allerdings, den Typ von null mit
console.log(typeof null);
zu ermitteln, erhält man nicht – wie erwartet – die Zeichenkette null, sondern object. Das wirkt auf den ersten Blick durchaus richtig, da null auch in anderen Sprachen dazu verwendet wird anzuzeigen, dass ein Verweis auf kein Objekt verweist, doch richtig ist es deshalb trotzdem nicht.
Übrigens ist JavaScript mit der Idee eines Null-Typs nicht alleine, auch beispielsweise C# kennt und verwendet einen solchen Typen. In C# macht sich der Typ derart bemerkbar, dass die Typinferenz für null nicht unterstützt wird und der Versuch, sie anzuwenden, zu einem Compilerfehler führt.
Eine weitere Eigenheit des Typsystems von JavaScript, die seltsam anmutet, ist die Einstufung von Arrays als object. Technisch gesehen ist das zwar durchaus sinnvoll, hilft aber in der Anwendungsentwicklung selten weiter, da man in der Regel Objekte und Arrays unterschiedlich behandeln möchte – beispielsweise beim Einsatz von Schleifen.
Außerdem kennt JavaScript eine Reihe von Konstruktorfunktionen, die einen Wrapper für einfache Datentypen darstellen. So repräsentiert
new Number(23)
zwar die Zahl 23, das Ergebnis wird von typeof aber als object und nicht als number eingestuft. Auch hier gilt wieder, dass das technisch zwar völlig korrekt ist, aber üblicherweise wenig hilfreich.
Unterm Strich lässt sich sagen, dass der typeof-Operator von JavaScript seine Aufgabe passabel erledigt: Meistens liefert er das erwartete Ergebnis, in einigen Fällen aber eben auch nicht, oder er liefert technisch zwar korrekte Angaben, die aber nicht zwingend dem entsprechen, was man herausfinden will.
Es bietet sich also an, einen Ersatz dafür zu schaffen, der möglichst syntaxkompatibel ist, aber intuitiver funktioniert und eher das zurückliefert, was man erwartet.
Ein npm-Modul, was das umsetzt, ist typedescriptor, dessen Quellcode als Open Source auf GitHub zur Verfügung steht. Damit lässt sich beispielsweise der folgende Code schreiben, der statt object den tatsächlich erwarteten Typ zurückgibt:
console.log(Type.of([ 2, 3, 5, 7, 11 ]));
// => 'array'
Wie das Modul entstanden ist, zeige ich in der 24. Folge meiner Einführung in Node.js.
Empfohlener redaktioneller Inhalt
Mit Ihrer Zustimmmung wird hier eine Vimeo-Video (Vimeo LLC) geladen.
Ich bin damit einverstanden, dass mir externe Inhalte angezeigt werden. Damit können personenbezogene Daten an Drittplattformen (Vimeo LLC) übermittelt werden. Mehr dazu in unserer Datenschutzerklärung.
tl;dr: Der typeof-Operator von JavaScript hat einige Mängel, die sich aber durch ein eigenes Modul leicht beheben lassen. Die neue Folge der Einführung in Node.js zeigt, wie sich ein solches Modul entwickeln lässt. ()