Привязки const и let
Используй const для привязки, которую не переназначают, и let для действительного переназначения.
Плохо
export function renameUser(user) {
const CURRENT_USER = user; // имя выбрано только из-за const
CURRENT_USER.name = 'Новое имя'; // объект вызывающего кода изменен
return CURRENT_USER;
}
Хорошо
export const DEFAULT_TIMEOUT_MS = 5000;
export function renameUser(user, name) {
const updatedUser = { ...user, name };
return updatedUser;
}
Почему это важно
Привязка, семантическая константа и неизменяемые данные — разные свойства. Их смешение скрывает мутацию и создает бессмысленный UPPERCASE.
Когда применять
Для JS/TS. Пример показывает копирование верхнего уровня и не гарантирует независимость вложенных объектов. Для горячего алгоритма допустима контролируемая мутация принадлежащих ему данных; правило не требует всегда копировать все структуры.
Подробные условия
const не делает объект или массив неизменяемым: их свойства могут меняться. Если нужна неизменяемость, выбери соответствующий контракт владения, readonly-проверку типов или runtime-защиту с учетом ее глубины; не обещай deep immutability от одного ключевого слова.
Обычная const-переменная остается camelCase. UPPER_SNAKE_CASE допускается для именованных констант уровня модуля с устойчивым значением/назначением по соглашению проекта, например DEFAULT_TIMEOUT_MS. Полученный пользователь, результат запроса и callback не становятся такой константой только из-за const.
Кто что делает
Человек
Определяет владение данными и область допустимой мутации.
AI-агент
Отделяет запрет переназначения от неизменяемости объекта и не делает все const-имена прописными.
Как проверить у себя
- Привязка не переназначается → объявить → const с обычным camelCase.
- Переименовать пользователя через пример → сравнить → возвращен новый объект, исходное name сохранено.
- В объекте есть вложенный объект → изменить его после shallow copy → обнаружена общая ссылка; deep immutability не заявлена.
Первоисточники
- TypeScript Handbook: Variable Declarations — let, const and binding versus object mutation.
- Google TypeScript Style Guide — Naming and constants; источник соглашения, не требование языка.
Дата проверки отражает содержательную сверку. Синхронизация сайта не обновляет её автоматически.