Jetzt, da TypeScript herauskommt, ist es eine aufregende Nachricht für mich, aber wie kann ich alle vorhandenen JavaScript-Dateien in TypeScript konvertieren?
Jetzt, da TypeScript herauskommt, ist es eine aufregende Nachricht für mich, aber wie kann ich alle vorhandenen JavaScript-Dateien in TypeScript konvertieren?
Antworten:
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".
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 .
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.
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 {} \;
var a = 5; a = "";