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

134

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

Gisway
источник
3
Все ваши файлы javascript уже являются файлами машинописного текста, поскольку машинописный текст является надмножеством javascript.
Бенджамин Грюнбаум
6
Это противоположность не по теме, преобразование с одного языка программирования на другой - ПОЛНОСТЬЮ вопрос программирования.
Иван Кастелланос
2
@Tony_Henrich Что ж, тогда его следовало переместить туда, а не «закрыть как оффтоп», и, кстати, на таком сайте должна быть четкая категория для рекомендаций по программному обеспечению, предназначенных для разработчиков программного обеспечения.
Иван Кастелланос
3
@Tony_Henrich Скажем так: это лучший результат в Интернете для «преобразования JavaScript в TypeScript», и лучшее, что вы можете сделать, - это закрыть его от дальнейших ответов и назвать его не по теме? Я думаю, что такое узкое мышление приведет к упадку этого сайта.
Иван Кастелланос
5
смешно, что это закрыли как не по теме.
bharal

Ответы:

112

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

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

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

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, включая их типы. Поэтому они позволяют проверять типы во время компиляции и использовать фантастический интеллект. Файл .d.ts для моего примера будет

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

Сохраните его как «myjsfile.d.ts» и импортируйте его в машинописный текст с помощью

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

обязательно включите скрипт JavaScript в свой html-файл над скомпилированным машинописным текстом. Вот интересная ссылка . Возможно, вас заинтересует раздел «Превращение JavaScript в TypeScript».

ЛХК
источник
58
+1 за указание на то, что не все действительные JS являются действительными TS.
Кен Смит
14
Фактически, все опубликованные вами фрагменты javascript являются допустимыми типографскими скриптами. Вам просто нужно отключить некоторые переключатели компилятора, такие как --noImplictAny и т. Д. Тем не менее, неплохо было бы в конечном итоге включить их и добавить аннотации типов, где это необходимо
Liero
Спасибо. Я не получаю ничего, кроме аргументов, когда говорю людям, что TypeScript не является надмножеством JavaScript, какой бы пример я ни приводил. В конце концов люди отказываются от аргументации, когда я показываю им, почему, а затем они спорят точно так же на следующей неделе, как будто забыв доказательство в пудинге. « весь действующий код JavaScript также действителен код TypeScript ... просто неверен » - LHK
Коди
3
Поскольку TypeScript допускает компиляцию в JavaScript, несмотря на «ошибки» TypeScript (в текущей демонстрационной версии TypeScript все примеры JavaScript в этом ответе не имеют проблем с компиляцией), он вроде как работает как надмножество - по крайней мере, тех функций JavaScript, которые компилятор TypeScript способен обрабатывать ...
Бретт Замир
Да, я был "по обе стороны" в этом вопросе. По сути, TS - это надмножество JS в том смысле, что: TypeScript будет жаловаться на какой-то действительный код JS, но пока noEmitOnErrorон выключен, он все еще может работать и передавать свою транспиляцию. Таким образом, хотя он показывает ошибки (что беспокоит), вы можете фактически игнорировать эти ошибки и использовать транспиляцию TypeScript, несмотря на это (позволяя, например, постепенный переход от JS к TS). Кроме того, по крайней мере, некоторые ошибки можно отключить с помощью переключателей вроде noImplicitAny(возможно, все, хотя и IDK).
Venryx
51

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

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

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

Шкредов С.
источник
Я бы хотел делать это на лету, используя редактируемые вручную метафайлы, создавая все необходимые TS раздуты.
xamiro
Здравствуйте, я использую resharper, поэтому переименование только с .js на .ts? Как я использую файл a.js и переименование файла с a.ts is resharper даст какие-либо предложения? Я использую версию сообщества Visual Studio и установил Resharper
Swift
1

Из терминала (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 {} \;
7zark7
источник
10
+1 - это немного похоже на попытку автоматически преобразовать сокращенную книгу обратно в полную версию.
Fenton
Вся информация о типе удалена, и все интерфейсы удалены - это довольно много информации пропало. Любой JavaScript, имеющий достаточно информации для вывода информации о типе, можно просто вставить в файл TypeScript, и компилятор определит типы, но есть много экземпляров, которые не будут работать, потому что JavaScript не согласован.
Fenton
1
Преобразовать из чего в что? Получение типов из JS и добавление их в вары? Не уверен, что еще можно преобразовать автоматически, не уверен, как классы, интерфейсы, модули могут быть получены (разумно).
7zark7
4
Не весь код JavaScript действителен в TypeScript, попробуйте следующее:var a = 5; a = "";
coudy,
4
Чтобы поддержать это и оправдать отрицательный голос, вы очень быстро поймете, что не весь код JS действителен в TypeScript, когда вы пытаетесь преобразовать модули или плагины в TypeScript из их родного JS (например: jquery.address и т.д.)
dpb,