TypeScript или JavaScript: так ли нужны типы?
TypeScript стал выбором по умолчанию для многих новых проектов на JavaScript, и для этого есть веские основания. Но вопрос «добавлять ли TypeScript» не решается одинаково для всех — это компромисс, и стоит понимать, чем именно вы жертвуете, прежде чем переводить на него всю кодовую базу.
Что такое TypeScript на самом деле
TypeScript — это JavaScript с надстроенной поверх необязательной системой типов. Вы пишете обычный JavaScript, а затем указываете для переменных, параметров функций и возвращаемых значений, какую структуру данных они ожидают. Компилятор проверяет эти аннотации ещё до запуска кода, а потом удаляет их и выдаёт обычный JavaScript, который работает везде, где работает JavaScript.
Главная идея: вместо того чтобы во время выполнения узнать, что вы передали строку туда, где функция ждала число, вы узнаёте об этом ещё при написании кода — благодаря интеграции с редактором часто даже до того, как сохранили файл.
Что на самом деле дают типы
- Ошибки обнаруживаются раньше. Целый класс багов — неверные типы аргументов, опечатки в именах свойств, забытая обработка null — ловит компилятор, а не пользователь в продакшене.
- Автодополнение, которое действительно точно. Редактор знает точную структуру объекта, поэтому предлагает реальные свойства и методы, а не угадывает.
- Безопасный рефакторинг. Переименуйте поле или измените сигнатуру функции — и TypeScript отметит каждое место, которое теперь нужно обновить, вместо того чтобы вы находили их по одному сбою за раз.
- Типы как документация. Сигнатура функции сообщает, что она принимает и возвращает, без всяких комментариев — и, в отличие от комментария, не может незаметно устареть.
Чего это стоит
Ничто из этого не даётся даром. Кода с самого начала приходится писать больше: аннотации типов, интерфейсы, дженерики, когда всё усложняется. Порог входа вполне реальный, особенно когда дело доходит до продвинутых приёмов типизации. Кроме того, TypeScript добавляет в процесс этап компиляции — ещё одно место, где что-то может пойти не так, и ещё одна вещь, в которой новичкам в команде придётся разобраться.
Для небольшого скрипта, быстрого прототипа или проекта, который вы выбросите через неделю, такие накладные расходы обычно не окупаются. Обычный JavaScript позволяет двигаться быстрее и ничего не теряя, потому что защищать здесь нечего — ничего долгоживущего нет.
Когда TypeScript себя окупает
Всё меняется, как только с кодовой базой начинает работать больше одного разработчика или она живёт дольше нескольких месяцев. Типы превращают неявные предположения о данных в то, что компилятор активно проверяет, а это становится крайне важно, когда команда вырастает или проект переживает первые недели. Ошибка типа, пойманная в редакторе, стоит секунд. Тот же баг, найденный в продакшене, стоит сеанса отладки, срочного исправления и, возможно, недовольного клиента.
Практический ответ
Для всего, что вы собираетесь поддерживать, развивать или передавать другому разработчику, — а это описывает большинство реальных продуктов — TypeScript стоит вложенных усилий. Для действительно одноразовых скриптов он необязателен. Мы по умолчанию используем TypeScript в новых проектах веб-разработки и заказного ПО именно потому, что цена ошибки типа растёт с каждым месяцем жизни кодовой базы, а большая часть того, что мы создаём, рассчитана на годы, а не на недели.