TypeScript: Implizite Umwandlung von allem zu allem?

8

Ich lerne gerade TypeScript und bin etwas perplex über die Art von any . Sieh dir das an:

%Vor%

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

, erwarten %Vor%

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:

  1. Gibt es das Analog zu any , etwas wie das obige unknown , das ist Standard?
  2. Wenn ja, warum ist any so prominent und die andere so versteckt?
  3. Wurde dieses Problem irgendwo angesprochen? Gibt es eine Diskussion, mit der sich jeder verbinden kann?
John 22.11.2014, 19:15
quelle

2 Antworten

8

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.

    
Ryan Cavanaugh 22.11.2014 20:08
quelle
6

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).

    
Fenton 22.11.2014 20:03
quelle

Tags und Links