Teraz pojawił się TypeScript, jest to dla mnie ekscytująca wiadomość, ale jak mogę przekonwertować wszystkie istniejące pliki JavaScript na TypeScript?
typescript
javascript
Gisway
źródło
źródło
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”.
źródło
noEmitOnError
jest 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 jaknoImplicitAny
(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.
źródło
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 {} \;
źródło
var a = 5; a = "";