Чи є інструмент для перетворення файлів JavaScript у TypeScript [закрито]


133

Тепер вийшов TypeScript, це захоплююча новина для мене, але як я можу конвертувати всі існуючі файли JavaScript у TypeScript.


3
Усі ваші файли javascript - це вже файли машинописів, оскільки typecript - це суперсеть JavaScript.
— Бенджамін Груенбаум

6
Це навпаки поза тематикою, перетворення з однієї мови програмування на іншу - ВІДПОВІДНО питання програмування.
— Іван Кастелланос

2
@Tony_Henrich Ну, тоді це потрібно було б перенести туди, а не "закрито як офтопік", і на btw такий сайт повинен бути чітка категорія рекомендацій щодо програмного забезпечення, призначених для інженерів програмного забезпечення.
— Іван Кастелланос

3
@Tony_Henrich Поставимо це так: це найвищий результат в Інтернеті для "перетворення JavaScript у TypeScript", і найкраще, що ви можете зробити, це закрити його з подальших відповідей і назвати це поза темою? Я думаю, що таке вузьке мислення стане крахом цього сайту.
— Іван Кастелланос

5
смішно, що це було закрито як поза темою.
— бхарал

Відповіді:


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
— Cody

3
Оскільки TypeScript дозволяє компілювати в JavaScript, незважаючи на "помилки" TypeScript (у поточній демонстраційній версії TypeScript, всі приклади JavaScript у цій відповіді не мають проблем зі складанням), він начебто працює як суперсет - принаймні з тих функцій JavaScript, які компілятор TypeScript здатний обробляти ...
— Бретт Замір

Так, я "був з обох сторін" цього питання. По суті, TS - це суперсеть JS в тому сенсі, що: TypeScript буде скаржитися на деякий дійсний код JS, але поки noEmitOnErrorвін не працює, він все ще може працювати і випромінювати свою транспіляцію. Таким чином, хоча він показує помилки (що викликає занепокоєння), ви можете фактично ігнорувати ці помилки і використовувати транспіляцію TypeScript незважаючи на це (дозволяючи, наприклад, поступовий перехід від JS до TS). Також принаймні деякі помилки можна відключити за допомогою перемикачів типу noImplicitAny(можливо, всіх, хоча IDK).
— Венрікс

51

Оновлення: Інструмент детально описаний у цій публікації

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

Не пробував цього на прикладах реального світу. Але він здатний конвертувати велику кількість шаблонів JavaScript.


Я хотів би зробити це на ходу, використовуючи вручну відредаговані мета-файли, створюючи всю необхідну TS-групу.
— xamiro

Привіт, я використовую resharper, щоб лише перейменувати штраф із .js на .ts тільки? Як я використовую a.js файл і перейменування файлу wih a.ts є переробник дасть якісь пропозиції? Я використовую версію спільноти візуальної студії та встановив 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 {} \;

10
+1 - це трохи схоже на спробу автоматичного перетворення скороченої книги у повну версію.
— Фентон

Видаляється вся інформація про тип і видаляються всі інтерфейси - це вже досить багато інформації. Будь-який JavaScript, у якого є достатня інформація для висновку про інформацію про тип, просто може бути вставлений у файл TypeScript, і компілятор опрацює типи, але є багато випадків, які не працюватимуть, оскільки JavaScript не відповідає.
— Фентон

1
Перетворити з чого в що хоч? Отримання типів від JS та додавання їх до vars? Не впевнений, що ще може бути автоматично перетворений, не впевнений, як класи, інтерфейси, модулі можуть бути отримані (розумно).
— 7zark7

4
Не всі коди JavaScript дійсні в TypeScript, спробуйте це:var a = 5; a = "";
— coudy

4
По-друге, і виправдавши скоромовку, ви дуже швидко зрозумієте, що не весь код JS є дійсним у TypeScript при спробі перетворення модулів або плагінів на TypeScript з рідного JS (наприклад: jquery.address тощо)
— dpb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.