- PVSM.RU - https://www.pvsm.ru -

Мысли вслух о TypeScript

Прошло уже некоторое время, как я впервые познакомился и подружился с TypeScript. В те времена версия еще не перевалила за единицу [1]. А недавно вышел релиз 1.7 [2]. За это время мы привыкли друг к другу и пережили много успехов и разочарований. Мне хочется немного поделиться своими впечатлениями и размышлениями по поводу этого диалекта JavaScript как самостоятельного языка. Идея подобного поста возникла у меня спонтанно при обсуждении очередного холивара с коллегами.

Итак, что же такое собственно TypeScript [3] — наверно уже ни для кого не секрет. Но все же, хочу упомянуть, что это попытка Microsoft принести в JavaScript статическую типизацию. Примеры кода и задачи, которые он позволяет решать, можно посмотреть на официальном сайте [4] или здесь на хабре [5], благо статей написано уже не мало. На хабре уже есть статья подобного рода TypeScript: общие впечатления [6], поэтому, чтобы не повторяться, я решил выделить плюсы и минусы работы с языком, опираясь на свой личный опыт. Вспомнить и перечислить плюсы и минусы языка оказалось довольно непросто.

Популярность языка

Проект TypeScript создан компанией Microsoft. Фактически его создателем является Аннерс Хейлсберг [7]. Практически с самого начала TypeScript стал быстро набирать популярность в силу своей гибкости и производительности. Немало проектов, которые были написаны на JavaScript, стали переноситься на TypeScript. Рост интереса к этому языка вызван еще и тем, что ряд идей, которые в нем реализованы, в последующем стали частью нового стандарта JavaScript. Все больше проектов переписывается на этом языке, включая такие крупные как Angular 2.0 [8] и vscode [9].

Цитаты авторитетных людей

TypeScript, возможно, один из лучших JavaScript языков на фронтенде. Код, который он генерирует, выглядит наиболее привлекательно. И я думаю, что он способен снять нагрузку со стандарта ECMAScript по реализации таких вещей, как декларации и классы. Андерс показал, что этот функционал хорошо поддерживается препроцессором, поэтому нет необходимости изменять основной язык.

Я считаю, что свободная типизация в JavaScript — это одно из достоинств языка и проверка типов переоценена. TypeScript добавляет удобства слишком дорогой ценой. И эта не та цена, за которую я готов платить.

Дуглас Крокфорд — создатель JSLint. Оригинал [10]

Для пользователей Visual Studio — TypeScript довольно хороший инструмент для разработки, и к тому же он отлично соответствует стандарту ES6. Я бы мог больше рассказать об этом языке, но не вижу смысла сравнивать его с Dart.

Брендан Айк — основатель JavaScript. Оригинал [11]

Я огромный поклонник CoffeeScript хотя это и другой язык с самостоятельным синтаксисом. Что мне нравится в TypeScript — так это то, что статическая типизация позволяет обеспечить процесс компиляции с предупреждениями, умный рефакторинг кода. В дополнение к этому вы получаете легкую навигацию по коду. В текущей версии CoffeScript вы не получите таких возможностей.

Скотт Хансельман — евангелист Microsoft. Оригинал [12]

Плюсы

О плюсах TypeScript написано довольно много. Поэтому постараемся тезисно отметить его преимущества:

  • Поддержка многими популярными IDE:

  • TypeScript — строго типизированный (опционально!) и компилируемый в JavaScript язык. Проще для освоения Java и C# программистами.
  • TypeScript реализует многие концепции ООП, такие как наследование, полиморфизм, инкапсуляция и модификаторы доступа. В нем есть классы, интерфейсы и (даже!) абстрактные классы.
  • Потенциал языка позволяет быстрее и проще писать сложные комплексные решения, которые легче развивать и тестировать в дальнейшем, чем на стандартном JavaScript.
  • TypeScript — надмножество JavaScript, поэтому любой код на JavaScript будет выполнен и в TypeScript. Это, на мой взгляд, его главное преимущество перед конкурентами — например, Dart от компании Google, который является кардинально переработанным языком из Javascript. Есть статья [17] по переводу проекта на Javascript в TypeScript

Минусы

Как мне кажется, что в большинстве случаев TypeScript хвалят. Поэтому мне хотелось написать свой пост о том, что же не так в Typescript. И как оказалось, найти минусы было довольно не просто.

  • В процессе разработки имеем дело с файлами *.ts, *.d.ts, *.map, *.js. Слишком много дополнительных файлов, что бывает неудобно, если ваш проект небольшой.
  • Не все браузеры поддерживают отладку TypeScript в консоли без лишних настроек.
  • Множество нетривиальных классов. Чтобы писать код, опираясь на классы, приходится держать в голове какое свойство где находится. Например вместо одного класса Event существуют еще такие как MouseEvent, TouchEvent, KeyboardEvent и другие...
  • Неявная статическая типизация. Всегда можно описать тип как any, что по факту отключит приведение к конкретному типу этой переменной.
  • Это транспайлер, что подразумевает, что мы должны всегда иметь под рукой tsc
  • d.ts декларации поддерживаются сообществом DefinitelyTyped [18] и часто не соответствуют текущей версии библиотеки. Либо не учитывают сложных вариантов (generic-функции, возвращаемые значения нескольких типов)

Немного о статической типизации

В жизни каждого разработчика бывает время, когда он пишет код в свое удовольствие. Будь это домашний проект, или работа в команде над проектом, который только начали писать с нуля. Это один из прекрасных моментов, когда не приходится много думать о конфликтах в коде с коллегами и искать ошибки. Но проект растет, обрастает новым функционалом и багами, связанными в том числе и с типами, если вы пишете свой код на динамически типизированном языке, коим является JavaScript.

Какое может быть решение в этом случае? Писать тесты!

Но согласитесь, зачем проверять то, с чем чем хорошо может справиться машина еще на стадии компиляции? Языки со статической типизацией избавляют нас от излишнего написания дополнительных тестов, которые связаны с ошибками в типах. Поэтому TypeScript имеет большое преимущество перед JavaScript, если мы не игнорируем типы.

Рассмотрим простой пример

У нас есть функция, которая умеет складывает два числа:

function sum(a, b) {
  return a + b;
}

Ваш заказчик предложил реализовать веб форму, в которой бы пользователь мог вводить складываемые числа:

var result = sum(
  document.getElementById("input1").value,
  document.getElementById("input2").value,
)

document.getElementById("result").innerText = result;

Пишем в наши поля ввода два числа, 2 и 3 и проверяем работу нашей функции:

23

Результат получился довольно неожиданный. Всё дело в том, что поле value у html-тега input возвращает результат типа «string» и JavaScript склеивает две строки «1» и «2» вместо того, чтобы сложить эти числа.

Пример, конечно довольно простой, но в реальной жизни ошибки могут быть и сложнее, и их бывает довольно трудно заметить на стадии разработки.

Решение подобной задачи довольно легко решается с помощью TypeScript:

function sum(a: number, b: number): number {
  return a + b;
}

sum(2, 3);   // Ok
sum(2, "3"); // Error!

Уже на этапе компиляции мы смогли обнаружить ошибку. Тратить силы лучше на разработку, а не на поиск ошибки и написания дополнительных тестов.

Вывод

Когда я думал над плюсами и минусами разработки на TypeScript, выделить минусы оказалось не просто. TypeScript больше оправдывает себя в крупных проектах. Это связано с тем, что разработка на нем занимает больше времени чем на JavaScript, из-за того что приходится помимо методов и классов описывать и их декларации. Но тем не менее, пока в JavaScript нет статической типизации, TypeScript является отличной альтернативой.

P.S. Целью моей статьи было разобраться в достоинствах и недостатках TypeScript и скорее всего я что-то упустил. Поэтому буду рад любым комментариям по существу.

Автор: greybax

Источник [19]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/106941

Ссылки в тексте:

[1] не перевалила за единицу: http://blogs.msdn.com/b/typescript/archive/2013/12/05/announcing-typescript-0-9-5.aspx

[2] релиз 1.7: http://blogs.msdn.com/b/typescript/archive/2015/11/30/announcing-typescript-1-7.aspx

[3] TypeScript: http://www.typescriptlang.org/

[4] официальном сайте: http://www.typescriptlang.org/Handbook

[5] здесь на хабре: http://habrahabr.ru/search/?q=typescript&target_type=posts&order_by=relevance

[6] TypeScript: общие впечатления: http://habrahabr.ru/post/258957/

[7] Аннерс Хейлсберг: https://ru.wikipedia.org/wiki/%D0%A5%D0%B5%D0%B9%D0%BB%D1%81%D0%B1%D0%B5%D1%80%D0%B3,_%D0%90%D0%BD%D0%BD%D0%B5%D1%80%D1%81

[8] Angular 2.0: https://angular.io/

[9] vscode: https://github.com/Microsoft/vscode

[10] Оригинал: https://plus.google.com/+DouglasCrockfordEsq/posts/MgzNUSTwjRt

[11] Оригинал: https://brendaneich.com/2012/10/harmony-of-dreams-come-true/#comment-1201

[12] Оригинал: http://www.hanselman.com/blog/WhyDoesTypeScriptHaveToBeTheAnswerToAnything.aspx

[13] Visual Studio Code: https://code.visualstudio.com/Docs/languages/typescript

[14] WebStorm: https://www.jetbrains.com/webstorm/help/typescript-support.html

[15] Sublime Text: https://github.com/Microsoft/TypeScript-Sublime-Plugin

[16] Eclipse: https://github.com/palantir/eclipse-typescript

[17] Есть статья: https://alfilatov.com/posts/mighriruiem-js-kod-v-typescript/

[18] DefinitelyTyped : https://github.com/DefinitelyTyped/DefinitelyTyped

[19] Источник: http://habrahabr.ru/post/272055/