Чи є інструмент для перетворення файлів 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.