Есть ли инструмент для преобразования файлов JavaScript в TypeScript

Теперь вышел TypeScript, это захватывающая новость для меня, но как я могу преобразовать все существующие файлы JavaScript в TypeScript.

Ответ 1

Я боюсь, что это будет очень проблематично. TypeScript - это надмножество JavaScript. Это означает, что все допустимые JavaScript-код также действительны TypeScript. Это просто неправильно. Следующий код верен в JavaScript, но создает ошибку в TypeScript:

var data={x:5, y:6};
data.z=5;

Вы можете получить динамическое поведение JavaScript, объявив данные как "ambient"

var data:any={x:5, y:6};
data.z=5;

Теперь это будет работать и в TypeScript. Тем не менее вы можете изменить расширение .js файла на .ts и передать этот файл компилятору TypeScript. Это действительно смутило меня, и я задал вопрос в канале IRC TypeScript на freenode. Оказалось, что компилятор TypeScript проверяет свой вход для действительного JavaScript и просто ничего не делает, если он что-то находит. Интуитивно это звучит хорошо. Вы должны иметь возможность "конвертировать" весь ваш JavaScript в TypeScript, просто обновляя расширения файлов и быть хорошими. К сожалению, это не работает должным образом. Предположим, у вас есть этот код:

var func=function(n){alert(n)};

var data={x:5};
data.z=6;

Изменить: Я просто попытался скомпилировать это, и он не работает. Извините, я, кажется, ошибся: компилятор TypeScript даже не принимает чистый JavaScript. Я попытаюсь выяснить, что пошло не так.

Вы изменили расширение файла на .ts и использовали функцию func в своем другом коде. Сначала все кажется прекрасным, но потом появляется уродливая ошибка. Вы решили, что некоторые статические проверки типов, вероятно, помогут вам, и вы измените код на:

var func=function(n:string){alert(n)};

var data={x:5};
data.z=6;

Но теперь это уже не действительный код JavaScript и заставит компилятор генерировать множество сообщений об ошибках. Ведь у данных нет члена "z".... Этого поведения можно было бы избежать, если тип по умолчанию всегда был бы "любым", но тогда вывод типа был бы совершенно бесполезным.

Итак, как вы решаете эту проблему? Ответ: файлы декларации. Вы можете использовать свой JavaScript-код "как есть" в проекте и по-прежнему получать статическую проверку типов с помощью нескольких файлов .d.ts. Они сообщают компилятору, какие переменные, методы и "классы" объявлены в файле JavaScript, включая их типы. Поэтому они позволяют проверять тип времени компиляции и фантастическую intellisense. Файл .d.ts для моего примера будет

declare var data:any;
declare function func(n:string);

Сохраните это как "myjsfile.d.ts" и импортируйте его в TypeScript с помощью

///<reference path="myjsfile.d.ts"/>

обязательно включите JavaScript script в свой html файл выше скомпилированного typescript. Здесь интересная ссылка. Вас может заинтересовать раздел "Включение JavaScript в TypeScript".

Ответ 2

Обновление: Инструмент подробно описан в этом сообщении

ReSharper, начиная с версии 9 (доступные сборки EAP), имеет функции автоматического преобразования кода JavaScript в TypeScript. Вы можете начать с переименования файла .js в .ts и увидеть предложения R #, подобные этому:

Не пробовал это на примерах реального мира. Но он способен преобразовывать большое количество шаблонов JavaScript.

Ответ 3

От терминала (mac):

for f in *.js; do mv $f `basename $f .js`.ts; done;

Переименовывает все .js файлы в .ts

Это немного лаконично - но, как указывает Бенджамин выше , файлы JavaScript действительны TypeScript. Если вы хотите добавить в свой JavaScript типы, классы, интерфейсы и т.д., Вам нужно будет разработать и изменить свой код с помощью этих понятий. Для этого мало или нет автоматического преобразования.

С GNU findutils (большинство * nixes) + Bash, просто выполните:

find -type f -name '*.js' -exec bash -c 'mv "${1}" "${1%???}.ts"' bash {} \;