typescript

TypeScript — строго типизированный язык программирования, разработанный Microsoft и впервые выпущенный в 2012 году. Он является надмножеством JavaScript: любой валидный JavaScript-код является валидным TypeScript-кодом. TypeScript добавляет опциональную статическую типизацию, интерфейсы, обобщения (generics) и другие конструкции, которые проверяются во время компиляции и затем удаляются при трансляции в чистый JavaScript.

Зачем нужен TypeScript в JavaScript-проектах

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

Практический эффект ощущается особенно в крупных кодовых базах: рефакторинг становится безопаснее (компилятор находит все затронутые места), а автодополнение в IDE — точнее. Исследования Microsoft показывают, что TypeScript позволяет обнаружить около 15% JavaScript-ошибок статически.

Система типов TypeScript

TypeScript предлагает богатую систему типов, включающую:

  • Примитивные типы: string, number, boolean, null, undefined, symbol, bigint.
  • Массивы и кортежи: number[], Array<string>, [string, number].
  • Объектные типы и интерфейсы: описывают форму объекта с именованными свойствами и их типами.
  • Union и Intersection: string | number — значение одного из типов; A & B — значение, удовлетворяющее обоим типам.
  • Generics: параметрические типы, позволяющие писать переиспользуемый типобезопасный код: function identity<T>(arg: T): T.
  • Mapped types и Conditional types — мощные механизмы трансформации типов на уровне системы типов.
  • Literal types: переменная может принимать только конкретное значение: "GET" | "POST".
  • Type guards: сужение типа внутри условных блоков через проверки typeof, instanceof или пользовательские функции.

Интерфейсы и типы: в чём разница

TypeScript предоставляет два способа описать форму объекта: interface и type. Интерфейсы можно расширять через extends и дополнять через декларативное слияние (declaration merging) — удобно для расширения сторонних типов. Type aliases универсальнее: поддерживают union, intersection, mapped и conditional types. На практике обе конструкции взаимозаменяемы для объектных типов; рекомендации команды зависят от стиля.

Строгий режим и настройка tsconfig

Поведение TypeScript настраивается через файл tsconfig.json. Флаг "strict": true включает группу проверок, настоятельно рекомендованных для новых проектов:

  • strictNullChecks — null и undefined не присваиваются типам без явного указания.
  • noImplicitAny — запрещает неявный тип any.
  • strictFunctionTypes — строгая проверка типов параметров функций.

Дополнительные опции: target (версия JavaScript на выходе), module (система модулей), paths (алиасы импортов), baseUrl.

TypeScript в экосистеме современного frontend

Сегодня TypeScript фактически стал стандартом в JavaScript-экосистеме. React, Next.js, Angular (написан полностью на TS), Vue 3, NestJS — все эти фреймворки имеют первоклассную поддержку TypeScript. Большинство крупных npm-пакетов поставляются с файлами .d.ts (определения типов) или имеют их в репозитории DefinitelyTyped (@types/*).

Декораторы и метаданные

TypeScript поддерживает декораторы — синтаксис для аннотирования классов, методов и свойств метаданными. Они широко используются в Angular (@Component, @Injectable) и NestJS (@Controller, @Get). В 2023 году декораторы были стандартизированы в предложении TC39 Stage 3, и TypeScript 5.0 добавил поддержку нового синтаксиса.

Производительность и инструменты

TypeScript-компилятор (tsc) может быть медленным для крупных проектов. Для ускорения сборки используют esbuild или SWC — компиляторы на Rust/Go, которые транспилируют TS в JS без проверки типов (type checking остаётся на tsc). Vite, Next.js Turbopack и другие современные инструменты используют именно такой подход: быстрый рантайм + отдельная проверка типов в CI.

Где применяется TypeScript

TypeScript используется на frontend (React, Angular, Vue), на backend (Node.js, NestJS, Deno — который поддерживает TS нативно), в мобильной разработке (React Native), в serverless-функциях (AWS Lambda, Vercel Edge Functions) и даже для скриптинга вместо bash в Node.js-окружениях. GitHub, Slack, Airbnb, Microsoft — всё это компании, активно использующие TypeScript.

Частые вопросы

  • TypeScript заменяет JavaScript или дополняет его?

    Дополняет. TypeScript транспилируется в JavaScript; браузеры и Node.js не понимают TypeScript напрямую. TypeScript добавляет статическую типизацию и расширенный синтаксис поверх JavaScript, сохраняя полную обратную совместимость: любой JS-файл можно переименовать в .ts и постепенно добавлять типы.

  • Обязательно ли указывать типы для каждой переменной?

    Нет. TypeScript умеет выводить типы из контекста (type inference). Например, const x = 42 автоматически получает тип number без явной аннотации. Типы нужно указывать явно там, где вывод не справляется: в параметрах функций, в возвращаемых типах публичных API, для сложных структур.

  • Что такое тип any и почему его стоит избегать?

    Тип any отключает проверку типов для данной переменной — она может принимать любое значение, и компилятор не выдаёт предупреждений. Это удобно при постепенной миграции, но лишает проекта гарантий типобезопасности. Вместо any рекомендуется использовать unknown (требует явной проверки перед использованием) или точные типы.

Не хватает деталей?

Напишите, что уточнить по теме «typescript» — это помогает улучшать материал и подсказывает, какие термины добавить дальше. Email необязателен: укажите, если хотите ответ только для вас (мы не шлём рассылки).

Поделиться