2016-04-23 3 views
4

Все эти дни вынуждают машинопись. В нем так много поклонников и статей. Угловая команда делает свои рамки в TS. Но мой опыт миграции ES6 в TS был очень разочаровывающим.Является ли машинопись достаточно прочной?

Я попытался перенести нашу относительно новую кодовую базу (написанную в ES6) на Typcript в прошлом месяце и столкнулся с тонкой подводных камней!

Чтобы быть ясным, речь идет о приложении node.js с модульными модулями mocha и настройке ESLint (с использованием babel для пересылки).

Прежде всего, чтобы уполномочить проверку типов, я установил опцию noImplicitAny, получил сотни ошибок и исправил их. Но после этого у меня возникли ошибки при наборе текста из-за того, что машинописный текст не понимает некоторые предварительно определенные модули node.js, например stream (проблема на самом деле больше из-за отсутствия типирования для большого количества модулей).

После этого я установил typings - рекомендуется замена для tsd инструмент для управления библиотекой d.ts файлов, но это node определение набора текста, при решении stream проблемы, добавил много ошибок, потому что он дублирует некоторые предопределенные типы.

Кроме того, я обнаружил, что машинопись на самом деле не скомпилирует многие функции ES6 в ES5, например, генераторы. Это заставило меня сделать сложный процесс сборки (TS -> (машинопись) ES6 -> (babel) ES5), а это значит, что мне приходится тратить свои исходные исходные карты.

Все вышеизложенное потребовалось много времени для настройки.

Итак, я смущен. Мне очень нравится идея машинописного текста, но реализация кажется мне такой грубой. Надеюсь, я ошибаюсь.

Может быть, кто-нибудь, кто использовал Typcript в реальном проекте, а не HelloWorld, мог бы объяснить мне, что я делаю неправильно?

ответ

5

настроить noImplicitAny вариант

У вас есть очень высокие ожидания. Для лучшего опыта при миграции проекта с ES6 просто не используйте эту опцию.

У меня возникли ошибки при наборе текста из-за машинописных текстов, которые не понимают некоторые предварительно определенные модули node.js, например stream.

Библиотеки JS, которые не имеют определений типов, являются болью. Но неявный тип any спасет вас.

После этого я установил типизацию [...], добавив много ошибок, потому что он дублирует некоторые предопределенные типы.

Исключить каталог браузера и browser.d.ts с вашего tsconfig.json.

Кроме того, я узнал, что машинопись не скомпилирует многие функции ES6-ES5 на самом деле, например, генераторы.Это заставляет меня сделать сложный процесс сборки (TS -> (машинописный) ES6 -> (babel) ES5), а это значит, что мне приходится тратить свои исходные исходные карты.

Это дизайн выбор, который делает TS действительно надежный: скомпилированный код не нуждается в какой-либо библиотеки времени выполнения.

Но почему вы используете Babel для генерируемого кода ES6? С Node.js 4 или 5 ваш код ES6 будет работать нормально.

Является ли машинопись достаточно прочной?

В отличие от JavaScript VM.

машинопись с мишенью ES6 на Node.js

Так как TS 1.7, опция --module может быть использована в сочетании с мишенью es6. Например, в tsconfig.json:

"compilerOptions": { 
    "module": "commonjs", 
    "target": "es6", 
} 

Примечание: Так как TS 1.8, modules are emitted with a "use strict"; prologue.

+0

Благодарим вас за ответ, @ Палео! У меня не было больших надежд на 'noImplicitAny', только что настроено было временно, чтобы реорганизовать мой код ES6 с определениями типов. Так что это не проблема. О узле v4-5 - он позволяет ES6 работать, но с ограничениями, такими как создание «строгого режима», необходимого для ключевого слова 'let' или что-то в этом роде. Кроме того, теперь невозможно использовать модули ES6 с чистым Node.js. Я что-то упустил? –

+2

Узел 5 имеет флаги, которые не требуют строгих ограничений. Это флагов, которые я использую, чтобы заставить Node 5 работать правильно с TypScript '--use_strict --harmony --harmony_default_parameters --harmony_destructuring'. Хотя с выпуском Node 6 большая часть этого станет дефолтом. – ArcSine

+0

@ Elessar.perm, так как TS 1.7, вы можете использовать опцию '--module' в сочетании с целевым' es6'. – Paleo

Смежные вопросы