Ich lerne gerade TypeScript und bin etwas perplex über die Art von any
. Sieh dir das an:
Zuerst habe ich any
als den Typ ohne irgendwelche Versprechungen verstanden - weshalb die erste Zuweisung sinnvoll ist -, aber es scheint, dass es in anderen Kontexten (der zweiten Zuweisung) ein Typ mit alle denkbaren Versprechen.
Zum Beispiel, dieser Teil des Wahnsinns kompiliert auch gut:
%Vor% Das liegt daran, dass undefined
als any
angenommen wird, was ein Typ ist, der alles verspricht. Hmmm.
Vergleiche das mit
%Vor%Hier erhalten wir, was ich von einer etwas allgemeineren Sache in einer stark typisierten Sprache erwarten würde: Ein Fehler, da eine explizite Umwandlung notwendig wäre:
%Vor% In den meisten Fällen, in denen any
verwendet wird, würde ich etwas wie unknown
, definiert als
wäre eine bessere Wahl.
Ich bin zuerst auf dieses Problem gestoßen, weil mein Code eval
verwendet hat, um json zu analysieren. eval
gibt any
zurück, was bedeutet, dass TypeScript denkt, dass Sie alles ohne irgendwelche Umwandlungen machen können.
Ich denke, das ist eindeutig falsch. Vergleichen Sie dieses Problem mit anderen typisierten Sprachen wie C #:
%Vor%Oder C ++:
%Vor%Immer wenn ich eine Funktion habe, die etwas Untypisches erzeugt, würde ich erwarten, dass ich es umwandeln muss, bevor ich es für irgendetwas verwenden kann.
Meine Fragen sind also:
any
, etwas wie das obige unknown
, das ist Standard? any
so prominent und die andere so versteckt? Für die erste Frage ist das Äquivalent zu unknown
{}
, der leere Typ. Der Compiler erzeugt manchmal {}
, wenn kein anderer Typ berechnet werden kann (z. B. in ['foo', 42]
, der Elementtyp war {}
, bevor er mit dem Hinzufügen von Union-Typen string|number
wurde).
Als nächstes wird der Grund any
oft erwähnt, dass die typische Beschwerde über TypeScript ist, dass es zu viel Art der Durchsetzung hat, anstatt zu wenig. JavaScript-Programmierer scheinen einfach nicht in der Lage zu sein, die ganze Zeit Typecasts zu schreiben. Offensichtlich ist das eine Frage des Geschmacks, aber es ist was es ist.
Dies ist alles sehr viel Design, weil ein Kernszenario für TypeScript darin besteht, ein vorhandenes Stück JavaScript zu verwenden und genau so viele Typinformationen hinzuzufügen, wie Sie wollen, ohne Tonnen und Tonnen von Fehlern zu bekommen. Immer wenn TypeScript etwas ohne eine Typ-Annotation sieht, deren Typ nicht abgeleitet werden kann, verwendet es any
, weil dies der Typ ist, der die meiste JavaScript ohne Fehler kompilieren lässt.
Das undefined.foo
Ding wurde in Version 1.1 behoben. Es meldet jetzt korrekt einen Fehler (die genaue Behandlung von undefined
und null
in TypeScript ist eine interessante, aber separate Diskussion).
Wie Steve erwähnt, ist noImplicitAny
da, um zu helfen. Es wird Fehler verursachen, wenn etwas vom Typ any
ist, wo es keine explizite Typ-Annotation gab.
Der any
-Typ ist ein spezieller Typ. Wenn möglich, sollten Sie den Typ any
nicht verwenden, es sei denn, Sie möchten dynamische Typen nutzen.
Der any
-Typ ist eine kurze Art zu sagen ...
Behandle diese Variable so, als ob sie mit anderen anderen Typen kompatibel wäre.
So können Sie es einer Zeichenkette, einer Zahl, einem Array, einem Objekt, einer Schnittstelle mit irgendeiner Struktur ... alles mögliche zuweisen.
Also denke nicht, dass es sich um einen any
-Typ handelt, denke an es als "eine Zeichenkette , wenn ich sie einer Zeichenkette " / p>
Sie können die versehentliche Verwendung des Typs any
vermeiden, indem Sie das Compilerflag --noImplicitAny
übergeben (oder Ihre Projekteinstellungen so einstellen, dass dieses Flag verwendet wird).
Tags und Links typescript