За последнюю неделю несколько разных людей интересовались через твиттер моим мнением о развитии 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 :)
До ката использована работа художника Сергея Корсуна «Кащей прячет утку в зайца»
Комментарии (61)
serf
09.03.2016 10:44+6Если это популярная библиотека, то для нее, скорее всего, уже будет написан TSD. А если нет – то его придется писать вам. Или подменять все ее глобальные идентификаторы. Больше работы, больше головной боли, и с этим ничего нельзя поделать.
Для серьезного долгосрочного проекта однократное написание TSD не стоит ничего, к тому же количество добаляемых в проект библиотек обычно довольно ограничено и в первую очередь будут выбираться "взрослые" библиотеки для которыз TSD уже готовы. Полагаю этот Austin работает с серьезными проектами, но тогда мне не понятно зачем притягивать за уши подобные доводы.Guria
16.03.2016 14:28Вот никак не могу понять как правильно написать d.ts для moment / jquery плагина, если в качестве менеджера тайпингов у меня
typings
.
Пол дня уже долблюсь. Среди уже опубликованных тайпингов подходящего примера не нашлось.Guria
16.03.2016 14:59То что мне надо описано в разделе Module Augmentation.
Вот только проблема, что я не могу написатьScale.prototype.advancedMethod = /* insert implementation */;
в t.sd файле
forcewake
09.03.2016 11:04+10Я считаю, что его популярность – это целиком и полностью заслуга Angular2.
Ох-ей. Как голословно-то. Angular2 появился не так уж и давно, что ставит под сомнение такие вот голословные высказывания.
Порой мне кажется, что сама Microsoft приплачивает таким вот хейтерам, чтобы язык был у всех на виду :)
serf
09.03.2016 11:13+7Посмотрел LInkedin профиль этого Austin, вроде опытный человек (хотя не все опытыне являются инженерами), а пишет какую-то желтизну, как будто заказали ему этот пост или просто решил трафика/внимания привлечь к себе.
KvanTTT
09.03.2016 11:22+10Typescript – это то, как, по мнению Microsoft, должен выглядеть JavaScript. У таких технологий, которые противопоставляют себя открытым / open source проектам есть одна закономерность. Они обычно проваливаются. Навскидку: Flash, Silverlight, CoffeeScript.
Что-то я не понял. И Typescript и CoffeScript являются open source.Frost47rus
09.03.2016 11:55+22А я про флеш не понял)) 20 успешных лет в вебе (учитывая, что аудитория технологии до сих пор колоссальна) — это провал? :)
mayorovp
09.03.2016 11:30+1TypeScript поддерживает компиляцию только для ES3/ES5/ES6. При этом nodejs 5.x только частично поддерживает ES6, так что при использовании TypeScript мы зависаем в непонятном “промежуточном состоянии”.
Автор оригинала что, не догадался выстроить два транслятора в цепочку? :)
Решение же очевидно — сначала компилируем ts в es6, потом компилируем es6 в совместимый с nodejs 5.x код.easimonenko
09.03.2016 12:57+1Компилирую из TypeScript в ES6, проблем с Node.js 5 не имею. Единственное, что нужно делать, это задавать опцию module: commonjs.
PQR
11.03.2016 23:47Поддерживаю выше недоумение! Сам компилирую цепочкой TypeScript (target ES6) -> Babel (куча настроенных presets) -> получаем ES5
Guria
16.03.2016 14:29-1скомпилируется из ts в es6?
let { a, b, ...rest } = props
Тут надо аналог babel для ts исходника :)
evocatus
09.03.2016 11:32+3Насчёт типов… в Lua появился тип int в последней версии (5.3). В Python вводят возможность типизирования по желанию, насколько я знаю. Есть ещё mypy.
Короче, интересный тренд намечается.grossws
10.03.2016 13:26+1Возможность типизирования звучит странно. У питона и так строгая система типов, строку с числом вы сложить не сможете. Другой вопрос, если вводят опциональную статическую типизацию.
bromzh
10.03.2016 16:02+1Что-то всё в кучу смешалось...
в Lua появился тип int
В lua есть такие базовые типы: nil, boolean, number, string, function, userdata, thread, table.
Просто до 5.3 все числа были с плавающей точкой. Нынче же тип number имеет 2 "подтипа" (вернее сказать, 2 реализации). Т.е. переменная, содержащая число, может быть в одном из 2-х внутренних представлений: либо float (как раньше), либо integer (вот это нововведение). Но это сделали только для оптимизаций. Т.е. в синтаксисе нет абсолютно никаких изменений, изменились только внутренние алгоритмы. Да и вообще, луа чаще всего используется как простой встраиваемый язык, так что статическая типизация в ней вряд ли появится.
В Python вводят возможность типизирования по желанию
Конечно нет.
Цитата из PEP-0484Python will remain a dynamically typed language, and the authors have no desire to ever make type hints mandatory, even by convention.
evocatus
10.03.2016 21:34Я недавно узнал про Julia и мне очень понравились многие идеи. Одно непонятно: она может компилироваться в sland-alone бинарник? Это же несложно, если используется LLVM?
SergeiStartsev
09.03.2016 11:48+14Ожидал увидеть аргументированную позицию, вместо этого набор клеше. Коротко по основным пунктам.
cпорю на что угодно, что через 3 года JavaScript все еще будет здесь. А вот про TypeScript я такое сказать, увы, не могу.
3 года в мире frontend — это очень даже приличный срок на самом деле, даже если не брать в голову, что цифра взята невесть откуда. А вообще это сродни спору об использованию фреймворков, они как правило исчезают/заменяются гораздо быстрее и часто замена не масштабируется на сколько нибудь большой проект, но что-то я не вижу падаения спроса на них.
Обратите внимание, что TypeScript раньше имел свой собственный синтаксис работы с модулями. А потом вышел ES6 и теперь разработчики TypeScript предлагают всем переходить на новый синтаксис. Чувствуете закономерность?
Имхо, замечательная закономерность, что авторы придерживаются стандартов.
Я считаю, что его популярность – это целиком и полностью заслуга Angular2.
Angular2 и не вышел-то еще толком и неясно еще как выстрелит, а автор приписываею ему заслугу популярности TS. Мне почему-то кажется, что ребята из Angular отказались от своего велосипеда в пользу TS как раз из-за его популярности и скожести идей.
Я не вижу сильного вовлечения сообщества в работе над спецификацией, грамматикой, языком.
Субъективно, конечно, но для меня показательно количество обсуждения и оперативная реакция на issues в сообществе на гитхабе.
По моим ощущениям, TypeScript ставит типы впереди JavaScript.
Было бы здорово посмотреть на конкретные примеры, которые автор имеет в виду.
TypeScript поддерживает компиляцию только для ES3/ES5/ES6.
Сейчас TS позволяет использовать некоторые фичы ES7, а полная поддержка ожидается после того как устаканется ES7.
А если компилировать в ES5 то получается много polyfills, которые сложно отлаживать.
Это точно проблема TS или характерная черта любого транспилятора? Ну и sourcemaps никто не отменял.
Три буквы: TSD
Ответили выше.
Так что, начав использовать TypeScript, я ожидал увидеть уже привычные “stage-1” и “stage-0” вещи из ES6.
Остается загадкой, что автор понимает под stage-0. Но вот здесь есть подробный роадмап того, что уже есть и что планируется.
Что превращает миграцию на TypeScript в непростую задачу.
В этом с автором согласен, мигрировать старый проект, который ничего не знает о типах, на типизированый скорее всего будет сильно веселой задачей. Но если автор пробовал миграцию старого проекта на ES6, то знает, что эта задача тоже сильно не уступает в веселости.serf
09.03.2016 12:14-2Но если автор пробовал миграцию старого проекта на ES6, то знает, что эта задача тоже сильно не уступает в веселости.
Я вообще считаю мигрировать на ES6 нет большого смыслы, ну станет год более "сахарным", но все фундаментальные проблемы то все равно останутся на месте, чего не скажешь о TypeScript.SergeiStartsev
09.03.2016 12:38Например, из-за модульности, этому принципу можно было следовать и ранее, используя amd/commonjs спецификации описания модулей, но с es6 вы получаете стандарт.
serf
09.03.2016 12:48webpack/browserify без проблем решают вопросы модульности.
SergeiStartsev
09.03.2016 12:59serf
09.03.2016 13:01webpack обработает es6 импорты при небольшой его настройке, а в v2 которая в бете это уже из коробки идет. Хотя я хз уживется ли es6 импорт с es5 кодом не пробовал, я require стиль использую.
orcy
09.03.2016 12:12+2cпорю на что угодно, что через 3 года JavaScript все еще будет здесь. А вот про TypeScript я такое сказать, увы, не могу
Это довольно серьезный аргумент для проектов которые собираются жить долго. Но насколько я понимаю typescript производит достаточно близкий код в javascript, так что если вдруг TypeScript ушел с горизонта транслируете все в js и сохраняете в репозитории. Признаюсь правда что сам на ts ничего не писал, рассказываю из того что о нем прочитал/просмотрел.
baka_cirno
09.03.2016 12:18+7TypeScript весь фан убивает, как будто на Java пишешь. На больших проектах оно, говорят, помогает, но для себя я никакого смысла им пользоваться не вижу. Если уж хочется безопасности, то лучше ELM за вымя потрогать, он куда более изящный и концептуальный.
xGromMx
09.03.2016 13:54Если быть честным, то более изящный и с исправленными проблемами haskell'я — это purescript.
PQR
11.03.2016 23:50Elm vs. Purescript: выбираю Еlm, т.к. он банально проще и ближе к народу, что ли… ближе к реальному production использованию. А Purescript — он крут, очень крут, но это совсем для любителей Хаскеля.
yul
09.03.2016 12:58+8Статья в целом очень слаба, но вот это мне особенно понравилось:
Также следует учесть, что у меня всего 3 недели опыта его практического использования
Babel — *****! Если бы вы спросили меня год назад, буду ли я использовать транспайлер, я бы посчитал вас за сумасшедшего. Sourcemap, gulp/grunt/watch/build/итд звучали для меня каким-то кошмаром. А потом раз – и зацепило.
Еще через пару недель его зацепит TypeScript и он напишет хвалебную статью?
Alexey2005
09.03.2016 13:22-4Если WebAssembly всё же взлетит, JS может ждать весьма печальное будущее.
Сейчас многие пользуются им лишь потому, что нет реальной альтернативы. А когда станет можно писать фронтэнд на любом языке, под который только создан компилятор, и начнут появляться всевозможные Java for Web, C++Web, WebHaskell и им подобные, JS может и вовсе скончаться.
zapolnoch
09.03.2016 17:12+2Мы 20 лет обходились без статической типизации и не страдали. Почему вдруг это стало такой проблемой?
sanex3339
09.03.2016 17:50+3Потому что на дворе 2016 год, и на JS'е пишутся уже не только всякие менюшечки и слайдбарчики, но и крупные приложения.
zapolnoch
09.03.2016 18:04-3Поэтому typescript захватил аж 0,03% рынка?
yorick_kiev_ua
09.03.2016 18:33А как они это считают очень интересно было бы узнать. В случае с TypeScript вообще нельзя 100% определить, js писался «руками» или его компилятор выдал. И это в случае если у вас есть исходник, а не минифицированый бандл, там вообще о том, кто и как его писал сказать можно примерно ничего.
По поводу «почему это вдруг стало» — так оно совсем не вдруг. Вот вам списочек(когда я заглядывал туда последний раз года два назад там было около 200 наименований). За редким исключением всё это попытки как-то решить эту внезапную проблему на самых разных уровнях.
https://github.com/jashkenas/coffeescript/wiki/list-of-languages-that-compile-to-jszapolnoch
09.03.2016 18:40Они считают через публичное API.
Когда CSS стал сложным, появились LESS и SASS. Сейчас они вместе занимают больше 25% рынка.
Когда JS стал сложным, появились Backbone, Ember, Knockout и Angular. А TypeScript занял свои достойные 0,03%.yorick_kiev_ua
09.03.2016 19:56+1Это что-то типа опроса, когда кто хочет тот и сообщает? Всё ясно, спасибо. Это типа «100% программ пишутся на Java, по результатам опроса через публичное API на сайте По данным опроса на java.com».
>Когда JS стал сложным, появились Backbone, Ember, Knockout и Angular.
Это просто библиотеки, при чём тут они к разговору? Тем более Angular, который видимо задолбались писать на pure js и таки начаи пилить в TS.
Вы пройдите по ссылке и увидите огромное разнообразие костылей: там и «пишем на C#/Java/… и перегоняем всё в js» и тонны специально придуманых языков TypeScript/CofeScript/Darth/… от груп энтузиастов до гигантов типа Google/MS.
Это всё попытки борьбы со сложностью, полытки переложить часть проверок на компилятор, игнорировать этот факт довольно глупо.
stalkerg
10.03.2016 11:56Когда CSS стал сложным, появились LESS и SASS. Сейчас они вместе занимают больше 25% рынка.
Всё наоборот, LESS, SASS, Stylus появились из-за того, что CSS слишком примитивный (сейчас по лучше).
Riim
09.03.2016 17:45-1Согласен на счёт FlowType, действительно как-то ненавязчиво он типы добавляет, указал тип — проверяет, не указал — пытается как-то его вывести и если уж возникает, то очень редко и действительно по делу. С typescript приходиться пол дня разбираться как его так настроить, что бы он уткнулся и не лез там где его не просят. Причём совсем утыкаться он всё же не хочет и кучу any всё равно приходиться добавлять. FlowType ещё долго до ума доводить (typescript тут всё же сильно впереди), но основа у него явно поудачней будет.
Ununtrium
09.03.2016 17:59-1Стиль изложения стартапщика из силиконовой долины, который под колесами после 16 часов непрерывной работы. Очередная вода с провокационным названием типа "Да, Детка, Typescript — Это Отстой". Автор пописав чего-то там на TS под node и Angular2 делает выводы по поводу языка вообще.
dom1n1k
09.03.2016 18:55+4Мне в целом нравится TypeScript, но я считаю его нишевой штукой. Кмк, его стихия — это крупные, долгосрочные проекты. Там где некоторая дополнительная громоздкость и лишний элемент в технологическом стеке — разумная плата за упорядоченность. Массовый рынок он не захватит. Но и не загнется, а отъест несколько процентов в своем сегменте (если говорить об обозримой перспективе — что будет через 10+ лет, не знает никто).
serf
13.03.2016 02:19-2Естественно TS массово рынок не захватит, потому что на рынке полно простых поделок, и это нормально. Уже ведь давно используют всякие питоны/php/руби для одних задач (стартапики всякие, пилоты, ну совсем упоротые и для серьезных проектов), и Java / C# / C++ для других. Так вот и здесь.
rosko
09.03.2016 20:15-7Я начинал писать с Паскаля, где строгая типизация, не пошло, скатился в Бейсик :)
Потом был Делфи, надстройка над Паскалем, с такой же строгой типизацией. Использовал пару лет, достало, ушел в ПХП.
С ПХП перешел на ДжаваСкрипт. И тут, и там нету никакой типизации. И это очень хорошо!!!
Совсем не понимаю к чему ДжС типизация. Ну, зачем? Хотите быть уверенными в собственном коде? Пишите тесты/спеки. А часть по сути тестов засовывать в код — нехорошо.gearbox
13.03.2016 13:35А часть по сути тестов засовывать в код
Вообще то это не тесты а контракты. С вашей логикой все строго типизованные языки тесты в код засовывают.
SirEdvin
Если вы не согласны с автором, то почему?
Вроде он высказал тезисы, которые сложно оспорить:
Не считая других, о которых мне сложно судить.
serf
Как отмечает Austin "Все что нужно будет сделать – это исправить синтаксис с помощью поиска и замены", так вот когда появятся типы в ECMAScript тогда можно будет применить его волшебную "автозамену" :) Вообще не видно чтобы они там планиовалии типы в своих стандартах, так что ждать их появления в стандарте придется долго, не говоря уже о появлении в бразерах, а с TypeScript уже сейчас можно писать как принято говорить maintainable и scalable приложения.
forcewake
Я могу оспорить ваши цитаты из перевода.
Вы имеете уникальную возможность пойти и прямо сейчас внести свой посильный вклад в развитие данной технологии. Путь начинается отсюда.
ts это надмножество js, следовательно, вы можете просто скопировать рабочее решение и использовать в ts — работать оно будет идентично. Если вам нужно чуть больше безопасности — на помощь придет tsd. Если оно устарело, чего-то не хватает, то вы можете сами это исправить и помочь другим.
Если бы вы следили за развитием языка, то увидели бы что он не вносит чего-то такого, что ломает концепции (как CoffeeScript, к примеру) — язык развивается последовательно. И я так может стать, что обещанная вами поддержка типов в js будет идентичной ts. Тогда все заиграет другими красками.
gearbox
можно про этот момент поподробнее (я без стеба). не силен в typescript, только погружаюсь, уже несколько раз сталкивался с этим утверждением и все никак не вкурю — как можно безболезненно подкрутить ванильный js к typescript проекту? по любому как минимум тайпинг писать ведь придется?
serf
typescript это superset js, так что любой уже написанный js будет изначально являтся валидным typescript кодом. С 1.8 версии добавился флаг --allowJs, в таком случае даже переименовывать файлы не нужно будет (то есть можно переводить на ts постепенно, но при этом собирая все в один бандл).
degorov
Не придётся, если типы не нужны. Более того, уже можно использовать tsc просто как ES6+ > ES5 компилятор. И JSX он тоже умеет компилировать, угу.
SirEdvin
А автор говорит, что для каждого подключенного файла в проект нужен tsd. Он не прав?
Sergiy
Не прав, tsd нужен только для самопроверки и автодополнений в редакторе кода.
easimonenko
Это из Вашего личного опыта следует или из праздничных деклараций евангелистов TypeScript? А вот мой личный опыт убеждает меня в том, что утверждение не совсем верно. Работающий код tsc может не скомпилировать, собственно, из-за несоответствия типов. И это не всегда ошибочный код, просто JavaScript более гибкий.
yorick_kiev_ua
Потому что аргументы его субъективны.
1. «Не управляется сообществом» не означает автоматического fail: есть масса примеров, когда «управляемые сообществами» проекты загибались и наоборот, с ног до головы проприеритарные языки вполне торт.
2. Есть dts для популярных библиотек, совершенно не проблема написать свой, если совсем невмоготу: thirdPartyCompanent: any и дальше в старом добром js стиле.
3. Рано или поздно будут и яблони на Марсе, но что мне делать конкретно здесь и сейчас? TS ИМХО появился именно потому, что очень уж отдалённое это «рано или поздно» и вообще непонятно наступит ли.
Ну и еще пара вещей: «TypeScript доступен с 2012 года!!! Я считаю, что его популярность – это целиком и полностью заслуга Angular2» — а не наоборот: он настолько зрелый, удобный и популярный, что даже Google выбрал TS для разработки(не pure js, не свой собственный Darth, а ts oт Майкрософта. От богомерзкого Майкрософта, Карл)?
P.S. Пример Flash, как «провалившейся» технологии… 20 лет в интернете, фактически монополист в своей нише, до сих пор не могут выпилить… Если это «провал», что что же такое «успех»?
timramone
Поддержка tsx (typescript and xml, аналог facebook'овского jsx для react с типами) была написана сообществом, после упорных доработок была включена в компилятор и уже полгода как доступна в Visual Studio. Официально. Говорить при этом, что TypeScript не управляется сообществом, мне кажется совершенно некорректно.