W jaki sposób programista może konwertować pliki JavaScript na TypeScript? [Zamknięte]

135

Teraz pojawił się TypeScript, jest to dla mnie ekscytująca wiadomość, ale jak mogę przekonwertować wszystkie istniejące pliki JavaScript na TypeScript?

Gisway
źródło
3
Wszystkie twoje pliki javascript są już plikami maszynopisu, ponieważ maszynopis jest nadzbiorem javascript.
Benjamin Gruenbaum
6
Jest to przeciwieństwo poza tematem, konwersja z jednego języka programowania na inny jest CAŁKOWICIE kwestią programowania.
Ivan Castellanos
2
@Tony_Henrich Cóż, więc powinno to zostać przeniesione do tego miejsca zamiast „zamknięte jako offtopic”, a przy okazji taka strona powinna mieć jasną kategorię zaleceń dotyczących oprogramowania przeznaczonych dla inżynierów oprogramowania.
Ivan Castellanos
3
@Tony_Henrich Ujmijmy to w ten sposób: to jest najlepszy wynik w Internecie dla „konwersji JavaScript do TypeScript” i najlepszą rzeczą, jaką możesz zrobić, to zamknąć go od dalszych odpowiedzi i nazwać go nie na temat? Myślę, że takie wąskie myślenie będzie przyczyną upadku tej strony.
Ivan Castellanos
6
śmieszne, że to zostało zamknięte jako nie na temat.
bharal

Odpowiedzi:

119

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

lhk
źródło
63
+1 za wskazanie, że nie wszystkie prawidłowe JS są poprawnymi TS.
Ken Smith,
16
W rzeczywistości wszystkie opublikowane przez Ciebie fragmenty kodu JavaScript są prawidłowymi maszynami. Musisz tylko wyłączyć niektóre przełączniki kompilatora, takie jak --noImplictAny, itp. Jednak dobrym pomysłem jest włączenie ich ostatecznie i dodanie adnotacji typu tam, gdzie jest to wymagane
Liero
Dziękuję Ci. Nie mam nic poza argumentacją, kiedy mówię ludziom, że TypeScript nie jest nadzbiorem JavaScript, bez względu na to, jaki przykład podam. W końcu ludzie rezygnują z kłótni, kiedy pokażę im dlaczego, a potem kłócą się tak samo już w następnym tygodniu, jakby chcieli zapomnieć o dowodzie w puddingu. „ cały prawidłowy kod JavaScript jest również prawidłowym kodem TypeScript ... jest po prostu nieprawidłowy ” - LHK
Cody
3
Ponieważ TypeScript umożliwia kompilację do JavaScript pomimo "błędów" TypeScript (w bieżącej wersji demonstracyjnej języka TypeScript wszystkie przykłady JavaScript w tej odpowiedzi nie mają problemu z kompilacją), działa on jako nadzbiór - przynajmniej te funkcje JavaScript, które kompilator TypeScript jest w stanie obsłużyć ...
Brett Zamir
Tak, byłem „po obu stronach” tego problemu. Zasadniczo TS jest nadzbiorem JS w tym sensie, że: TypeScript będzie narzekać na jakiś prawidłowy kod JS, ale dopóki 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).
Venryx,
53

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.

Shkredov S.
źródło
1
Chciałbym to zrobić w locie, używając ręcznie edytowanych plików meta, tworząc wszystkie potrzebne pliki TS.
xamiro
Witam, używam resharper, więc zmieniam tylko nazwę dobrze z .js na .ts? Tak jak ja używam pliku a.js i zmieniam nazwę pliku wih a.ts, czy resharper poda jakieś sugestie? Używam wersji społecznościowej programu Visual Studio i zainstalowałem Resharper
Swift
1

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 {} \;
7zark7
źródło
10
+1 - to trochę tak, jakby próbować automatycznie przekonwertować skróconą książkę z powrotem do pełnej wersji.
Fenton,
Wszystkie informacje o typach są usuwane, a wszystkie interfejsy są usuwane - to całkiem sporo informacji zniknęło. Każdy JavaScript, który ma wystarczającą ilość informacji, aby wywnioskować informacje o typie, można już wkleić do pliku TypeScript, a kompilator obliczy typy, ale istnieje wiele wystąpień, które nie będą działać, ponieważ JavaScript nie jest spójny.
Fenton,
1
Konwersja z czego do czego? Wyprowadzanie typów z JS i dodawanie ich do zmiennych? Nie jestem pewien, co jeszcze można by automatycznie przekonwertować, nie jestem pewien, jak można wyprowadzić klasy, interfejsy, moduły (rozsądnie).
7zark7
4
Nie cały kod JavaScript jest prawidłowy w TypeScript, spróbuj tego:var a = 5; a = "";
coudy
4
Po drugie i uzasadniając negatywną opinię, bardzo szybko zdasz sobie sprawę, że nie cały kod JS jest poprawny w TypeScript, gdy spróbujesz przekonwertować moduły lub wtyczki do TypeScript z ich natywnego JS (np .: jquery.address itp.)
dpb