Вашему вниманию предлагается перевод статьи, мнение автора которой я не разделяю абсолютно. Но статья уже собрала множество комментариев, включая поддерживающие. Было бы любопытно обсудить ее на Хабре, благо она небольшая.
За последнюю неделю несколько разных людей интересовались через твиттер моим мнением о развитии TypeScript (отлично зная, что я не являюсь его любителем). Собравшись с мыслями, я решил оформить их в виде этого поста.
Предупреждение: Это мое сугубо личное мнение, и я со всем уважением отношусь к команде разработчиков TypeScript. Также следует учесть, что у меня всего 3 недели опыта его практического использования: две с Nodejs 5.x и одна с Angular 2.
Нестандарт
TypeScript – это то, как, по мнению Microsoft, должен выглядеть JavaScript. У таких технологий, которые противопоставляют себя открытым / open source проектам есть одна закономерность. Они обычно проваливаются. Навскидку: Flash, Silverlight, CoffeeScript.
Если у вас большой проект, то выбор TypeScript – это то, с чем вам придется жить долгое время. Спорю на что угодно, что через 3 года JavaScript все еще будет здесь. А вот про TypeScript я такое сказать, увы, не могу.
ЭТО рано или поздно случится…
Рано или поздно JavaScript обзаведется поддержкой типов. Это неизбежно. По правде говоря, учитывая скорость развития JavaScript в последнее время, я удивлен, что поддержка типов еще не объявлена как “stage-0 proposal”. В тот момент, когда это случится, TypeScript сразу же превратится в тыкву технический долг.
Обратите внимание, что TypeScript раньше имел свой собственный синтаксис работы с модулями. А потом вышел ES6 и теперь разработчики TypeScript предлагают всем переходить на новый синтаксис. Чувствуете закономерность?
TypeScript тут довольно давно, и что?
TypeScript доступен с 2012 года!!! Я считаю, что его популярность – это целиком и полностью заслуга Angular2. Лично для меня это красный флажок.
Развивается не сообществом
Я не вижу сильного вовлечения сообщества в работе над спецификацией, грамматикой, языком. В разработке ES* влияние разработчиков со всего мира намного заметнее. Возможно, я ищу не там, но, ИМХО, им надо слушать разработчиков, а не имплементировать C# в JavaScript?!
Квадрат в круглом разъеме
Добавление типов в не-типизированный язык само по себе является сложной задачей. По моим ощущениям, TypeScript ставит типы впереди JavaScript. Это приводит к странностям при использовании «родных» фичей JavaScript.
Я фанбой Babel
Babel — *****! Если бы вы спросили меня год назад, буду ли я использовать транспайлер, я бы посчитал вас за сумасшедшего. Sourcemap, gulp/grunt/watch/build/итд звучали для меня каким-то кошмаром. А потом раз – и зацепило.
Babel потрясающе использует архитектуру плагинов. Мне очень нравится использовать самые “новые” фичи уровня “stage-0”. Да, выше по тексту я говорил про “нестандартные фичи”, Но то, что предлагает Babel, довольно скоро в том или ином виде появится в JavaScript. Все что нужно будет сделать – это исправить синтаксис с помощью поиска и замены. Плюс, использование “stage-0” фичей в реальных проектах позволяет проверить их на практике и поделиться результатами с разработчиками языка. Также радует возможность компилировать проект для разных платформ: nodejs 4 или 5, или для браузера.
TypeScript поддерживает компиляцию только для ES3/ES5/ES6. При этом nodejs 5.x только частично поддерживает ES6, так что при использовании TypeScript мы зависаем в непонятном “промежуточном состоянии”. А если компилировать в ES5 то получается много polyfills, которые сложно отлаживать.
Три буквы: TSD
TypeScript требует определений для всех файлов с исходным кодом, использованных в приложении. Звучит логично, да? Ему нужно знать типы, чтобы иметь возможность скомпилировать код. Но что будет, если вы используете библиотеку, которая не написана на TypeScript (а таких, секундочку, подавляющее большинство)? Если это популярная библиотека, то для нее, скорее всего, уже будет написан TSD. А если нет – то его придется писать вам. Или подменять все ее глобальные идентификаторы. Больше работы, больше головной боли, и с этим ничего нельзя поделать.
Что в коробке?
Мне нравится использовать самые последние фичи. Так что, начав использовать TypeScript, я ожидал увидеть уже привычные “stage-1” и “stage-0” вещи из ES6. Меня ждало разочарование – часть из них пока отсутствует. Потому что у разработчиков большие проблемы втиснуть их в рамки типизированного языка (троеточие, destructuring итд). Тем не менее, что-то все же есть, декораторы, например. И это заставляет меня постоянно упираться в стены – что я могу использовать, а что нет. В основном команда TypeScript добавляет в язык только фичи уровня “stage-3”.
Используйте типы только там, где необходимо
Думаю, я слышал это уже больше сотни раз. Но эти ребята не говорят вам, что какую-то информацию о типах добавлять придется в любом случае. И это обернется большой кучкой any, размазанной по всему вашему “старому” коду. Что превращает миграцию на TypeScript в непростую задачу.
Что насчет FlowType?
Учитывая мое негативное мнение, высказанное выше, вы, наверное, думаете что я так же не люблю FlowType? Не угадали. Мне кажется, что разработчики FlowType ставят во главу угла JavaScript, аккуратно надстраивая над ним типы. Для меня использование этого языка ощущается более естественным. Плюс – компилятор в виде плагина для Babel.
Вы, наверное, скажете, что это все равно нестандартное расширение? Да, но типы рано или поздно приземлятся в JavaScript. Но даже если этого не случится, всегда есть плагин strip-flow-types для Babel :)
До ката использована работа художника Сергея Корсуна «Кащей прячет утку в зайца»
Автор: Voximplant