Einführung in Node.js, Folge 24: Let's code (typedescriptor)

the next big thing  –  5 Kommentare

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.

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.

Einführung in Node.js, Folge 24: Let's code (typedescriptor)

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.