> Какие сущности 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
// Исходный TypeScript
enum 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 (они стираются).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью