> Какие сущности TypeScript остаются в рантайме после транспиляции (TypeScript)
Уровень: middle · Роль: frontend · Категория: Технические вопросы
Компании: ЛОЦИЯ
Стек: TypeScript
> Пример ответа
Короткий ответ
После транспиляции TypeScript в рантайме остаются все сущности JavaScript: переменные, функции, классы, объекты, массивы, примитивы. Из TypeScript-специфичных сущностей в рантайме остаются только enum (транслируется в объект), namespace (транслируется в объект с вложенными функциями), декораторы (если включены в tsconfig) и class field declarations (транслируются в this.field). Всё остальное - типы, интерфейсы, type aliases, generics, access modifiers - полностью удаляются.
Подробное объяснение
TypeScript - это надстройка над JavaScript, которая добавляет статическую типизацию. Компилятор tsc удаляет все аннотации типов и TypeScript-специфичные конструкции, оставляя чистый JavaScript. Однако некоторые сущности имеют runtime-представление:
- Enum - транслируется в объект с двунаправленным маппингом (ключ-значение и значение-ключ). const enum, напротив, инлайнится и не остаётся в рантайме.
- Namespace - превращается в объект с функциями, эмулируя модульную систему (устаревшая фича, не рекомендуется в современных проектах).
- Декораторы - остаются как вызовы функций, если в tsconfig включён experimentalDecorators.
- Class field declarations - если target ниже ES2022, поля класса транслируются в this.field = value в конструкторе.
- Parameter properties (конструктор с модификаторами доступа) - создают реальные поля на this.
Всё остальное: интерфейсы, type, generic type parameters, as, satisfies, implements, abstract (в контексте классов - только проверка, сам класс остаётся), readonly, public/private/protected - полностью стираются.
На практике
При разработке важно помнить, что TypeScript не добавляет runtime-защиты. Например, приватные поля через private - это только проверка на этапе компиляции, в рантайме к ним можно обратиться. Для настоящей приватности используйте JavaScript private fields (#). Enum может быть заменён на union type для уменьшения бандла. Namespace лучше не использовать - современные проекты используют ES modules.
Пример кода
TYPESCRIPT// Исходный TypeScriptenum Direction {Up = 'UP',Down = 'DOWN'}interface Config {apiUrl: string;timeout: number;}type Status = 'active' | 'inactive';class Service {private name: string;constructor(name: string) {this.name = name;}}// После транспиляции (упрощённо)"use strict";var Direction;(function (Direction) {Direction["Up"] = "UP";Direction["Down"] = "DOWN";})(Direction || (Direction = {}));class Service {constructor(name) {this.name = name;}}
Как отвечать на собеседовании
Начни с чёткого разделения: что остаётся (enum, namespace, декораторы, class fields) и что стирается (типы, интерфейсы, type, generics). Подчеркни, что TypeScript - это только инструмент для разработки, не влияющий на runtime. Упомяни const enum как исключение. Если спросят про private - объясни разницу с # private fields. Хорошо показать знание trade-off: enum удобен, но увеличивает бандл.
Что проверяет интервьюер
- Понимание разницы между compile-time и runtime в TypeScript.
- Знание, какие конструкции имеют runtime-представление.
- Осознание, что TypeScript не добавляет runtime-безопасности.
- Умение объяснить, как работает транспиляция конкретных фич (enum, namespace, декораторы).
- Понимание современных best practices (избегать namespace, использовать union вместо enum).
Типичные ошибки
- Утверждение, что все TypeScript-сущности остаются в рантайме.
- Забывают про enum и namespace как runtime-сущности.
- Путают private (compile-time) и # private (runtime).
- Думают, что interface или type можно использовать в runtime (например, instanceof с типом).
- Не знают про const enum и его отличие от обычного enum.
- Считают, что generics влияют на runtime (они стираются).
> Похожие задачи по frontend
Какие модификаторы классов есть в TypeScript
Как реализовать динамически настраиваемое поле в интерфейсе TypeScript
Почему проверка типа через instanceof не работает с интерфейсами в TypeScript
Что может быть неправильно в решении функции для вычисления площади фигур с использованием типов и интерфейсов TypeScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью