JavaScript давно вышел за пределы браузера. Его используют для бэкендов, мобильных приложений, облачных решений и многого другого. По мере роста сложности проектов стало очевидно, что динамическая типизация — одна из основных причин трудноотловимых ошибок и тяжёлого рефакторинга. Это и привело к появлению TypeScript.
Ниже — обзор целей и архитектуры TypeScript: почему он устроен именно так и что это даёт на практике.
TypeScript - расширенный набор JavaScript
TC39 — комитет, который регулирует разработку JavaScript, — регулярно вводит новые возможности в язык. Классы, блочные переменные и другие нововведения делают JavaScript более предсказуемым. Тем не менее сложные архитектурные требования язык выполняет с трудом: новые предложения TC39 проходят долгий путь до стандарта и поддержки во всех браузерах.
Каждая новая версия JavaScript расширяет предыдущую, поэтому «будущее JavaScript» можно представить как надмножество текущего стандарта. TypeScript был создан именно по этой модели — как расширенное надмножество JavaScript. Помимо этого, TypeScript добавляет возможности, выходящие за рамки TC39: проверку типов, обобщённые шаблоны и интерфейсы. Всё это — синтаксический сахар, который в итоге компилируется в обычный JavaScript.
Архитектура TypeScript: цели дизайна
Microsoft разработала TypeScript с конкретными архитектурными целями: полная совместимость с существующим JavaScript-кодом и дополнительные возможности, которых в самом JavaScript нет.
Совместимость JavaScript с TypeScript
TypeScript — расширенный набор JavaScript, поэтому он понимает и выполняет любой валидный JS-код. Обратное неверно: TypeScript-код содержит синтаксис, которого нет в JavaScript. Исключения из правила «валидный JS = валидный TS» — обработка необязательных параметров функции и присвоение значения литералу объекта.
При этом команда TypeScript согласовывает язык с конвейером ECMAScript: текущие и будущие предложения TC39 учитываются при проектировании новых возможностей TypeScript.
Предоставление проверки типа в JavaScript
JavaScript динамически типизирован и не создаёт структурных контрактов между переменными и конструкциями, которые их используют. Передача числа туда, где ожидается строка, не вызовет ошибки при разработке — проблема проявится только в рантайме.
TypeScript решает эту проблему статической проверкой типов во время компиляции. Формально аннотации типов необязательны, но именно они дают основную ценность: ранее обнаружение ошибок и более точная работа языкового сервиса в редакторе.
Более мощное объектно-ориентированное программирование на JavaScript
TypeScript добавляет классы, интерфейсы и модули — инструменты, которые делают объектно-ориентированный стиль понятнее и лаконичнее. Внутри классов можно явно указывать видимость свойств и методов через public, private и protected.
Отсутствие дополнительных трудностей
Браузеры не понимают TypeScript, поэтому код компилируется в JavaScript перед запуском. Компилятор может выводить код под любую целевую версию — вплоть до ES3. Конструкции, которые не имеют аналога в JavaScript, такие как аннотации типов и интерфейсы, просто удаляются при компиляции. Это называется стиранием типов: они существуют только во время разработки и не меняют поведение итогового кода.
Архитектура TypeScript: компоненты
Архитектура TypeScript аккуратно организована на разных уровнях.
Базовый компилятор TypeScript
Основная задача компилятора — проверка типов и преобразование TypeScript в валидный JavaScript. Опечатки и несовпадение типов аргументов компилятор фиксирует до запуска кода. Это полезно даже там, где есть тесты: статический анализ ловит целый класс ошибок раньше, чем они проявятся в рантайме.
TypeScript автономный компилятор, TSC
Автономный компилятор TypeScript, часто называемый tsc - это высокоуровневый компилятор, который берет файл TypeScript, .ts и выводит файл JavaScript, .js.
Языковая служба
Этот компонентный слой находится поверх основного компилятора TypeScript и предоставляет функции, необходимые для работы в IDE и текстовых редакторов: завершение операторов, форматирование и выделение кода, подсветка синтаксиса и многое другое. Языковая служба также обеспечивает рефакторинг кода: переименование переменных, отладка и инкрементная компиляция.
Интеграция инструментов
Аннотации типов дают IDE и редакторам контекст для более точного автодополнения и рефакторинга TypeScript-кода.
Итог
TypeScript не является уникальным для Angular — React, Vue и другие экосистемы давно его приняли. JavaScript и TypeScript развиваются параллельно, не конкурируя: TypeScript дополняет JavaScript там, где нужна статическая проверка типов, а не заменяет его.