Gibt es ein Tool zum Konvertieren von JavaScript-Dateien in TypeScript [geschlossen]

133

Jetzt, da TypeScript herauskommt, ist es eine aufregende Nachricht für mich, aber wie kann ich alle vorhandenen JavaScript-Dateien in TypeScript konvertieren?

Gisway
quelle
3
Alle Ihre Javascript-Dateien sind bereits Typoskript-Dateien, da Typoskript eine Obermenge von Javascript ist.
Benjamin Gruenbaum
6
Dies ist das Gegenteil von Off-Topic. Das Konvertieren von einer Programmiersprache in eine andere ist VOLLSTÄNDIG eine Programmierfrage.
Ivan Castellanos
2
@Tony_Henrich Nun, dann sollte dies dorthin verschoben worden sein, anstatt "als offtopic geschlossen", und übrigens sollte eine solche Site eine klare Kategorie für Softwareempfehlungen haben, die für Softwareentwickler bestimmt sind.
Ivan Castellanos
3
@Tony_Henrich Sagen wir es so: Dies ist das Top-Ergebnis im Internet für "JavaScript in TypeScript konvertieren". Das Beste, was Sie tun können, ist, es vor weiteren Antworten zu schließen und es als Off-Topic zu bezeichnen. Ich denke, solch ein enges Denken wird der Untergang dieser Seite sein.
Ivan Castellanos
5
lächerlich, dass dies als Off-Topic geschlossen wurde.
Bharal

Antworten:

112

Ich befürchte, dass dies sehr problematisch sein wird. TypeScript ist eine Obermenge von JavaScript . Dies bedeutet, dass jeder gültige JavaScript-Code auch gültiger TypeScript-Code ist. Welches ist einfach falsch. Der folgende Code ist in JavaScript korrekt, erzeugt jedoch einen Fehler in TypeScript:

var data={x:5, y:6};
data.z=5;

Sie können das dynamische Verhalten von JavaScript ermitteln, indem Sie Daten als "Umgebungsdaten" deklarieren.

var data:any={x:5, y:6};
data.z=5;

Dies funktioniert nun auch in TypeScript. Sie können jedoch die Erweiterung einer .js-Datei in .ts ändern und diese Datei an den TypeScript-Compiler übergeben. Das hat mich wirklich verwirrt und ich habe die Frage im TypeScript IRC-Kanal auf freenode gestellt. Es stellte sich heraus, dass der Typescript-Compiler seine Eingabe auf gültiges JavaScript überprüft und nichts unternimmt, falls er etwas findet. Intuitiv klingt das gut. Sie sollten in der Lage sein, Ihr gesamtes JavaScript in Typescript zu "konvertieren", indem Sie lediglich die Dateierweiterungen aktualisieren und loslegen. Leider funktioniert das nicht wie erwartet. Nehmen wir an, Sie haben diesen Code:

var func=function(n){alert(n)};

var data={x:5};
data.z=6;

Bearbeiten: Ich habe gerade versucht, dies zu kompilieren und es funktioniert nicht. Es tut mir leid, ich habe mich anscheinend geirrt: Der TypeScript-Compiler akzeptiert nicht einmal reines JavaScript. Ich werde versuchen herauszufinden, was schief gelaufen ist.

Sie haben die Dateierweiterung in .ts geändert und die Funktion func in Ihrem anderen Code verwendet. Zuerst scheint alles in Ordnung zu sein, aber dann taucht ein hässlicher Fehler auf. Sie entscheiden, dass eine statische Typprüfung Ihnen wahrscheinlich helfen würde, und ändern den Code in:

var func=function(n:string){alert(n)};

var data={x:5};
data.z=6;

Dies ist jedoch kein gültiger JavaScript-Code mehr und führt dazu, dass der Compiler viele Fehlermeldungen generiert. Immerhin haben Daten kein Mitglied "z". ... Dieses Verhalten könnte vermieden werden, wenn der Standardtyp immer "any" wäre, aber dann wäre die Typinferenz völlig nutzlos.

Wie lösen Sie dieses Problem? Die Antwort lautet: Deklarationsdateien. Sie können Ihren JavaScript-Code "wie besehen" im Projekt verwenden und trotzdem mithilfe einiger .d.ts-Dateien eine statische Typprüfung erhalten. Sie informieren den Compiler darüber, welche Variablen, Methoden und "Klassen" in einer JavaScript-Datei deklariert sind, einschließlich ihrer Typen. Daher ermöglichen sie eine Typprüfung zur Kompilierungszeit und eine fantastische Intelligenz. Eine .d.ts-Datei für mein Beispiel wäre

declare var data:any;
declare function func(n:string);

Speichern Sie dies als "myjsfile.d.ts" und importieren Sie es mit

///<reference path="myjsfile.d.ts"/>

Stellen Sie sicher, dass Sie das JavaScript-Skript über dem kompilierten Typoskript in Ihre HTML-Datei aufnehmen. Hier ist ein interessanter Link . Vielleicht interessiert Sie der Abschnitt "JavaScript in TypeScript verwandeln".

lhk
quelle
57
+1 für den Hinweis, dass nicht alle gültigen JS gültige TS sind.
Ken Smith
14
Tatsächlich sind alle von Ihnen veröffentlichten Javascript-Schnipsel gültige Typoskripte. Sie müssen nur einige Compiler-Schalter wie --noImplictAny usw. ausschalten. Es ist jedoch eine gute Idee, sie eventuell einzuschalten und bei Bedarf die Typanmerkungen hinzuzufügen
Liero
Danke dir. Ich bekomme nichts als Argumentation, wenn ich Leuten sage, dass TypeScript keine Obermenge von JavaScript ist, egal welches Beispiel ich anbiete. Schließlich geben die Leute den Streit auf, wenn ich ihnen zeige, warum, und dann streiten sie sich in der nächsten Woche genauso, als wollten sie den Beweis im Pudding vergessen. "
Cody
3
Da TypeScript die Kompilierung in JavaScript trotz TypeScript- "Fehlern" ermöglicht (in der aktuellen Demoversion von TypeScript haben alle JavaScript-Beispiele in dieser Antwort kein Problem beim Kompilieren), funktioniert es als Obermenge - zumindest für die JavaScript-Funktionen, die Der TypeScript-Compiler ist in der Lage ...
Brett Zamir
Ja, ich war "auf beiden Seiten" dieser Ausgabe. Grundsätzlich ist TS eine Obermenge von JS in dem Sinne, dass: TypeScript sich über einen gültigen JS-Code beschwert, aber solange dieser ausgeschaltet noEmitOnErrorist, kann er seine Transpilation ausführen und ausgeben. Während also Fehler angezeigt werden (was störend ist), können Sie diese Fehler tatsächlich ignorieren und trotzdem die TypeScript-Transpilation verwenden (was beispielsweise einen schrittweisen Übergang von JS zu TS ermöglicht). Außerdem können zumindest einige der Fehler durch Schalter wie noImplicitAny(vielleicht alle, obwohl IDK) deaktiviert werden .
Venryx
51

Update: Das Tool wird in diesem Beitrag ausführlich beschrieben

ReSharper ab Version 9 ( EAP-Builds verfügbar ) bietet Funktionen zum automatischen Konvertieren von JavaScript-Code in TypeScript. Sie können mit dem Umbenennen der .js-Datei in .ts beginnen und R # -Vorschläge wie diesen anzeigen:

Ich habe es nicht an Beispielen aus der Praxis versucht. Es ist jedoch in der Lage, eine große Anzahl von JavaScript-Mustern zu konvertieren.

Shkredov S.
quelle
Ich würde dies gerne im laufenden Betrieb tun, indem ich handbearbeitete Metadateien verwende, um alle TS-Aufblähungen zu erstellen, die es benötigt.
Xamiro
Hallo, ich verwende Resharper, also nur das Umbenennen von .js in .ts? Wie verwende ich eine a.js-Datei und benenne die Datei um, wenn a.ts resharper irgendwelche Vorschläge gibt? Ich benutze Visual Studio Community-Version und installierte Resharper
Swift
0

Vom Terminal (Mac):

for f in *.js; do mv $f `basename $f .js`.ts; done;

Benennt alle .js-Dateien in .ts um

Das ist ein bisschen frech - aber wie Benjamin oben hervorhebt, sind JavaScript-Dateien gültiges TypeScript . Wenn Sie Ihrem JavaScript Typen, Klassen, Schnittstellen usw. hinzufügen möchten - Sie müssen Ihren Code mithilfe dieser Konzepte selbst entwerfen und ändern -, gibt es dafür nur wenig / keine automatische Konvertierung.

Mit GNU findutils (die meisten * nixes) + Bash machen Sie einfach:

find -type f -name '*.js' -exec bash -c 'mv "${1}" "${1%???}.ts"' bash {} \;
7zark7
quelle
10
+1 - Es ist ein bisschen so, als würde man versuchen, ein gekürztes Buch automatisch wieder in die Vollversion zu konvertieren.
Fenton
Alle Typinformationen werden entfernt und alle Schnittstellen werden entfernt - das sind ziemlich viele Informationen. Jedes JavaScript, das über genügend Informationen verfügt, um auf die Typinformationen zu schließen, kann bereits in eine TypeScript-Datei eingefügt werden, und der Compiler berechnet die Typen. Es gibt jedoch viele Instanzen, die nicht funktionieren, da das JavaScript nicht konsistent ist.
Fenton
1
Von was zu was konvertieren? Typen von JS ableiten und zu Vars hinzufügen? Nicht sicher, was sonst noch automatisch konvertiert werden könnte, nicht sicher, wie Klassen, Schnittstellen, Module (vernünftig) abgeleitet werden könnten.
7zark7
4
Nicht jeder JavaScript-Code ist in TypeScript gültig. Versuchen Sie var a = 5; a = "";
Folgendes
4
Um dies zu unterstützen und die Ablehnung zu rechtfertigen, werden Sie sehr schnell feststellen, dass nicht der gesamte JS-Code in TypeScript gültig ist, wenn Sie versuchen, Module oder Plugins von ihrem nativen JS (z. B. jquery.address usw.) in TypeScript zu konvertieren
dpb