2015-04-28 9 views
15

Właśnie zacząłem używać TypeScript i czasami dostaję błędy kompilatora "użycie niezadeklarowanej zmiennej". Na przykład następujące prace w czystym JavaScript:Czy TypeScript jest naprawdę nadzbiorem JavaScript?

var foo = {}; 
foo.bar = 42; 

Jeśli staram się zrobić to samo w maszynopisie nie będzie działać i dać mi błąd wymieniony powyżej. Muszę napisać to tak:

var foo :any = {}; 
foo.bar = 42; 

In Plain JavaScript definicja typu z żadnym nie jest ani konieczne, ani ważna, ale w maszynopisie to wydaje się być obowiązkowe. Rozumiem błąd i powód dla niego, ale zawsze słyszałem w filmy i czytać w dokumentacji:

typescriptlang.org:

„maszynopis jest wpisany rozszerzeniem JavaScript [...]”

Introduction Video @minute 3:20:

"Cały kod JavaScript jest kod maszynopis, po prostu skopiuj i wklej"

Czy to coś zmieniło się podczas rozwoju TypeScript, czy też muszę przekazać określone ustawienia kompilatora, aby to działało?

+2

To jest nadzbiór. Ale to nie znaczy, że może być 1) skompilowany i 2) używany jako zwykły JavaScript. Objective-C jest nadzbiorem C/++, ale działa z własnym kompilatorem/IDE/środowiskiem. Musisz przestrzegać dyrektyw TypeScript i nie porównywać tego dosłownie z JavaScriptem. –

+2

Hmm, może to tylko złe sformułowanie. To naprawdę nie jest * błąd * czy to jest? Więcej ostrzeżenia *, ponieważ generuje poprawny skrypt JavaScript. Z pewnością TypeScript często zachwala się, że podanie Javascriptowi kompilatora powinno * "po prostu zadziałać" * – CodingIntrigue

+0

@AndreyPopov: Ok, ale nie jest to składniowy superkompilator JavaScript, a zwłaszcza drugi cytat jest nieprawidłowy ... – Markus

Odpowiedz

11

Powodem istnienia TypeScript jest posiadanie kompilatora i języka, który może wymuszać typy lepiej niż JavaScript. Każdy regularny Javascript jest poprawny TypeScript, syntaktycznie. To nie znaczy, że kompilator musi być z tego całkowicie zadowolony. Vanilla Javascript często zawiera kod, który jest problematyczny pod względem bezpieczeństwa typów. Nie powoduje to, że kod TypeScript jest nieprawidłowy, ale jest to dokładnie powód, dla którego istnieje TypeScript, a zadaniem kompilatora jest wskazanie tych problemów.

Języki jako takie nadal stanowią sub/supersets of each other.

+2

Uczyniłeś słowami to, co czułem i nie mogłem znaleźć właściwych słów do opisania. Kod TypeScript kompiluje i generuje wyjście JavaScript –

+3

Jeśli kompilator TypeScript zgłasza błąd, twierdzę, że kod jest niepoprawny TypeScript, mimo że kompilator nadal może emitować działający JavaScript. W konsekwencji argumentowałbym, że technicznie TypeScript to ** nie ** nadzbiór JavaScript. Co w żaden sposób nie zmniejsza wartości TypeScript, ponieważ jest to dokładnie celem TypeScript: Aby ograniczyć "dynamiczne" części JavaScript. – jbandi

3

Definicja

"Cały kod JavaScript jest kod maszynopis, po prostu skopiuj i wklej"

jest prawdą. Ponieważ dowolny kod JavaScript może zostać przekazany do kompilatora TypeScript.

To jest rodzaj warstwy na górze JavaScript. Tak więc, oczywiście warstwa podrzędna (JavaScript) może być przekazywana przez warstwy do góry (TypeScript), , ale nie na odwrót.

Dlaczego nie?

Pomyśl o tym jako o motocyklu (JavaScript) i motocyklu (TypeScript). Podstawy są takie same (dwa koła, rama), ale motocykl jako silnik i kilka ulepszonych funkcji.

Możesz więc używać motocykla (TypeScript) jako roweru (JavaScript), ale nie możesz używać motocykla jako motocykla.

EDIT:

Jeśli kompilator zgłasza ostrzeżenie, dlaczego to robi zestawienie źle? Po prostu mówi: Hej, używasz TypeScript i jest to bardziej surowe niż to, co mi dałeś.

See this example, kompiluje się idealnie do JavaScript, ale generuje ostrzeżenie.

+5

Jeśli możesz przekazać dowolny kod JS do kompilatora TypeScript, dlaczego poprawny JavaScript ('var foo = {}; foo.bar = 42;') rzuca błąd/ostrzeżenie? – JJJ

+0

Piszemy zwykły JavaScript w pliku .ts. Próbujesz użyć silnika silnikowego z prostym rowerem. Plik .js jest idealnie "kompilowany". –

+5

@gruberb Ale chodzi o to, że * nie *. Zobacz, jak OP podał prawidłowy JS i zgłasza błąd - tęskniłem za tym po raz pierwszy około – CodingIntrigue

Powiązane problemy