Если открыть исходники 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. Впрочем, это хороший пример того, что «устаревшее» — не всегда «плохое». Иногда это осознанный компромисс.
📎 Источник: