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?


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


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.


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 {} \;

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.