Найти в Дзене
Цифровая Переплавка

Временная мёртвая зона и почему в коде TypeScript до сих пор «живёт» var

Если открыть исходники TypeScript, можно удивиться: проект, который сам популяризировал строгую типизацию в JavaScript-мире, по-прежнему изобилует «древним» var. Казалось бы, зачем возвращаться к практикам 2000-х, когда у нас есть удобные let и const с блочной областью видимости и защитой от ошибок? Ответ неожиданный — производительность и временная мёртвая зона (TDZ).

Что такое Temporal Dead Zone (TDZ)

TDZ — это интервал времени в исполнении кода, когда переменная уже объявлена, но ещё не инициализирована. Любая попытка обратиться к ней в этот момент вызывает ReferenceError.

Пример:

function example() {
console.log(x); // ReferenceError: TDZ!
const x = 10;
}

Для var ситуация совсем иная: переменная «поднимается» (hoisting), и доступ к ней до инициализации возвращает undefined.

function example() {
console.log(x); // undefined
var x = 10;
}

Вроде бы удобство, но на практике — источник тончайших багов. Именно поэтому появление TDZ стало одним из самых больших улучшений в JS после const и let.

🛠️ Почему же TypeScript выбирает var?

Ответ прост — скорость. Проверка TDZ не может быть выполнена статически, она требует динамической логики на каждом обращении к переменной. А интерпретатору V8 приходится выполнять массу лишней работы.

Команда TypeScript провела эксперимент: массово заменили let/const на var и получили до 8% ускорения на реальных бенчмарках. Для огромного кода-базы компилятора это критично.

📦 Компромисс: удобство vs производительность

Используя var, TypeScript сознательно отказывается от современных гарантий:

  • 🔓 Нет TDZ → возможен доступ к «пустым» переменным без ошибки.
  • 🌀 Нет блочной области → переменные утекут наружу из if или цикла.
  • ✏️ Мутабельность по умолчанию → нельзя выразить настоящую константу.

С другой стороны:

  • 🚀 Выигрыш в скорости → компилятор работает быстрее.
  • 📉 Снижение накладных расходов на проверку областей видимости.
  • 🛠️ Контролируемый контекст → в коде компилятора ошибки TDZ маловероятны, так как логика тщательно выверена.

💡 Моё мнение

Мне кажется, здесь хорошо виден фундаментальный принцип инженерии: идеальная архитектура редко совпадает с идеальной практикой. Для обычных приложений использование let и const даёт меньше багов и повышает читаемость кода. Но в случае TypeScript — компилятора, который сам крутится вокруг миллионов строк и запускается тысячи раз в день — каждый процент производительности важен.

Ирония в том, что именно TypeScript приучил фронтендеров к аккуратному использованию let и const, а сам для внутренних нужд продолжает жить с var. Впрочем, это хороший пример того, что «устаревшее» — не всегда «плохое». Иногда это осознанный компромисс.

📎 Источник: