Почему лучше использовать const, а не let в TypeScript

Начиная карьеру разработчика ПО, я считал, что буду просто читать и обновлять собственный код. Сегодня просмотр и модификация чужого кода занимает около 80% моей работы.

И именно здесь встает вопрос о чистом коде.

Читабельность  —  один из основополагающих критериев чистого кода. Представьте, как тяжело поддерживать ПО с хаотичным кодом. Поэтому у меня  —  разработчика, которому еще многому предстоит научиться,  —  есть несколько стандартов для поддержания чистоты кода. Один из них заключается в том, чтобы всегда использовать const вместо let в TypeScript.

Почему const, а не let?

Представьте, что вам нужно поддерживать функцию бэкенд-сервиса express.js.

⬇️ Пример сервисной функции

const getUsers = async (): Promise<User[]> => {
  let users = await db.findAll...
  return users?.data || []
}

Основным назначением сервиса является взаимодействие с базой данных, а также мапирование и фильтрация данных в надлежащую структуру ответа.

Расширение с применением фильтра и средства преобразования с переопределением

const getUsers = async (): Promise<User[]> => {
  let users = await db.findAllInDB...
  users = users?.data || []
  users = users.filter(user => user?.data?.name && user?.data?.id)
  users = users.map(user => {
    id: user.id,
    firstName: user.name.split(' ')[0],
    loyaltyPoints: await getUserLoyaltyPoints(user.id)
  })
  return users
}

На мой взгляд, приведенный выше код совсем не чист. После первоначального определения переменной users происходят 3 обновления. По мере расширения проекта все труднее воспринимается его код. Приходится постоянно читать всю строку и запоминать изменения: users становится users.data, после этого используется filter, затем map и так далее.

Оптимальный способ создания более читабельного кода  —  всегда переопределять переменные с помощью const и использовать понятные имена.

🚀 Переопределение с помощью const считается хорошей практикой

const getUsers = async (): Promise<User[]> => {
  const users = await db.findAllInDB...
  const existingUsers = (users?.data || []).filter(
   user => user?.data?.name && user?.data?.id
  )
  const formattedUsers = existingUsers.map(user => {
    id: user.id,
    firstName: user.name.split(' ')[0],
    loyaltyPoints: await getUserLoyaltyPoints(user.id)
  })
  return formattedUsers
}

Такие шаги делают код более понятным. После извлечения users из базы данных мы определяем existingUsers (то есть существующих пользователей с id и name), а затем возвращаем formattedUsers с firstName и loyaltyPoints.

Еще раз отмечу: чем больше функция или проект, тем сложнее разобраться в коде, если одна переменная многократно перезаписывается.

Читайте также:

Читайте нас в TelegramVK и Дзен


Перевод статьи Daniel Babinszky: Always choose ‘const’ over ‘let’ in TypeScript

Предыдущая статьяАвтоматизируем задачи на Python с помощью ChatGPT
Следующая статьяЖиви и программируй: обретение баланса