В TypeScript (как и в современном JavaScript) переменные можно объявлять с помощью let, const и var, и между ними есть важные различия:
Пример:
if (true) { let a = 10; const b = 20; var c = 30; } console.log(c); // 30 — видна вне блока! console.log(a); // Error: a is not defined console.log(b); // Error: b is not defined
Типовые сценарии:
const — для значения, которое не должно изменяться (константы, настройки, ссылки на функции).let — для значений, которые изменяются при выполнении (счетчики, переменные в цикле).var — использовать не рекомендуется, только для поддержки старого кода.Может ли
constсделать объект полностью неизменяемым? Объясните, приведите пример.
Ответ: Нет, const предотвращает только изменение самой ссылки, но не защищает от изменений свойств объекта!
const obj = { x: 1 }; obj.x = 2; // Это допустимо! obj = { x: 3 }; // Ошибка: присвоение новое ссылки
Для полной иммутабельности используют Object.freeze:
const frozen = Object.freeze({ x: 1 }); frozen.x = 2; // Ошибка в строгом режиме, но не всегда компилятор предупреждает!
История
В процессе миграции крупного фронтенд-проекта на TypeScript разработчики массово заменили var на let, не учтя, что область видимости теперь блочная. Это привело к тому, что счетчики в некоторых for-циклах оказались недоступны вне цикла, и возникли неожиданные ошибки в логике: код перестал работать при попытках обратиться к счетчику цикла после завершения цикла.
История
Разработчик объявил константу через const для хранения объекта конфигурации, считая, что свойства защищены от изменений. Позже в рантайме другое место программы поменяло свойство: это вызвало трудноуловимые ошибки в обработке данных, потому что внешний код "нежданно" поменял глобальные настройки для всех пользователей.
История
В проекте одновременно использовались let, const и var без четкой политики. Один компонент переобъявил var-переменную в рамках функции, в то время как другое место ожидало, что переменная объявлена через let и потому вне блока она не будет видна. Итог: перекрытие переменных, сбои во внутренней логике и сложный дебаг проблем с неочевидным жизненным циклом переменных.