Teraz pojawił się TypeScript, jest to dla mnie ekscytująca wiadomość, ale jak mogę przekonwertować wszystkie istniejące pliki JavaScript na TypeScript?
Teraz pojawił się TypeScript, jest to dla mnie ekscytująca wiadomość, ale jak mogę przekonwertować wszystkie istniejące pliki JavaScript na TypeScript?
Odpowiedzi:
Obawiam się, że będzie to bardzo problematyczne. TypeScript to nadzbiór języka JavaScript . Oznacza to, że cały prawidłowy kod JavaScript jest również prawidłowym kodem TypeScript. Co jest po prostu błędne. Poniższy kod jest poprawny w JavaScript, ale tworzy błąd w TypeScript:
var data={x:5, y:6};
data.z=5;
Możesz uzyskać dynamiczne zachowanie JavaScript, deklarując dane jako „ambient”
var data:any={x:5, y:6};
data.z=5;
Teraz to zadziała również w TypeScript. Niemniej jednak możesz zmienić rozszerzenie pliku .js na .ts i przekazać ten plik do kompilatora TypeScript. To naprawdę zdezorientowało mnie i zadałem pytanie na kanale TypeScript IRC na freenode. Okazało się, że kompilator Typescript sprawdza swoje dane wejściowe pod kątem prawidłowego JavaScript i po prostu nie robi nic w przypadku, gdy coś znajdzie. Intuicyjnie brzmi to dobrze. Powinieneś być w stanie "przekonwertować" cały swój JavaScript na Typescript poprzez zwykłą aktualizację rozszerzeń plików i być gotowym do pracy. Niestety to nie działa zgodnie z oczekiwaniami. Załóżmy, że masz ten kod:
var func=function(n){alert(n)};
var data={x:5};
data.z=6;
Edycja: właśnie próbowałem to skompilować i to nie działa. Przepraszam, chyba się pomyliłem: kompilator TypeScript nawet nie akceptuje czystego JavaScript. Spróbuję dowiedzieć się, co poszło nie tak.
Zmieniłeś rozszerzenie pliku na .ts i używasz funkcji func w innym kodzie. Na początku wszystko wydaje się w porządku, ale potem pojawia się brzydki błąd. Decydujesz, że pewne statyczne sprawdzanie typów prawdopodobnie by ci pomogło i zmieniasz kod na:
var func=function(n:string){alert(n)};
var data={x:5};
data.z=6;
Ale teraz nie jest to już poprawny kod JavaScript i spowoduje, że kompilator będzie generował wiele komunikatów o błędach. W końcu dane nie mają elementu „z”. ... Tego zachowania można by uniknąć, gdyby domyślny typ zawsze miał wartość „any”, ale wtedy wnioskowanie o typie byłoby całkowicie bezużyteczne.
Jak więc rozwiązać ten problem? Odpowiedź brzmi: pliki deklaracji. Możesz użyć swojego kodu JavaScript „tak jak jest” w projekcie i nadal sprawdzać typ statyczny za pomocą kilku plików .d.ts. Informują kompilator, jakie zmienne, metody i „klasy” są zadeklarowane w pliku JavaScript, łącznie z ich typami. Dlatego pozwalają one na sprawdzanie typów w czasie kompilacji i fantastyczną inteligencję. Plik .d.ts dla mojego przykładu byłby
declare var data:any;
declare function func(n:string);
Zapisz to jako „myjsfile.d.ts” i zaimportuj do maszynopisu z rozszerzeniem
///<reference path="myjsfile.d.ts"/>
pamiętaj, aby umieścić skrypt JavaScript w pliku html nad skompilowanym typem. Oto interesujący link . Może zainteresuje Cię sekcja „Zamiana JavaScript na TypeScript”.
noEmitOnErrorjest wyłączony, nadal może działać i emitować transpilację. Tak więc, chociaż pokazuje błędy (co jest niepokojące), możesz je zignorować i mimo to użyć transpilacji TypeScript (pozwalającej na przykład na stopniowe przechodzenie z JS do TS). Ponadto przynajmniej niektóre błędy można wyłączyć za pomocą przełączników, takich jak noImplicitAny(być może wszystkie, chociaż IDK).
Aktualizacja: Narzędzie jest szczegółowo opisane w tym poście
ReSharper począwszy od wersji 9 ( dostępne kompilacje EAP ) ma funkcję automatycznej konwersji kodu JavaScript na TypeScript. Możesz zacząć od zmiany nazwy pliku .js na .ts i zobaczyć sugestie R #, takie jak ta:

Nie próbowałem tego na przykładach z prawdziwego świata. Ale jest w stanie konwertować dużą liczbę wzorców JavaScript.
Z terminala (Mac):
for f in *.js; do mv $f `basename $f .js`.ts; done;
Zmienia nazwy wszystkich plików .js na .ts
To trochę żartobliwe - ale jak Benjamin wskazuje powyżej, pliki JavaScript są poprawnymi TypeScript . Jeśli chcesz dodać typy, klasy, interfejsy itp. Do swojego JavaScript - sam będziesz musiał zaprojektować i zmienić swój kod za pomocą tych koncepcji - jest niewiele / nie ma automatycznej konwersji do tego.
Z GNU findutils (większość * nixes) + Bash, po prostu wykonaj:
find -type f -name '*.js' -exec bash -c 'mv "${1}" "${1%???}.ts"' bash {} \;
var a = 5; a = "";