ПрограммированиеFrontend разработчик

Расскажите про ключевое слово 'readonly' в TypeScript. Как и когда его стоит применять? В чем его особенности по сравнению с const?

Проходите собеседования с ИИ помощником Hintsage

Ответ.

Ключевое слово readonly в TypeScript применяется для свойств объектов и массивов, чтобы запретить их изменение после инициализации:

  • Используется в описании интерфейсов, типов и классов, чтобы нельзя было изменить значение поля после его установки.
  • readonly применяется только к свойствам объектов, а не к переменным.
  • В отличие от const, который указывает, что переменная не может быть переназначена, но не запрещает изменять содержимое объекта, readonly именно запрещает модификацию самого поля либо элемента массива.

Пример:

interface User { readonly id: number; name: string; } const user: User = { id: 1, name: 'Anna' }; user.id = 2; // Ошибка: Cannot assign to 'id' because it is a read-only property.

Для массивов:

const nums: readonly number[] = [1, 2, 3]; nums.push(4); // Ошибка: Property 'push' does not exist on type 'readonly number[]'.

Вопрос с подвохом.

В чём разница между const и readonly в TypeScript? Могут ли они заменять друг друга?

Ответ: Нет, не могут. const — это ограничение на саму переменную (нельзя переназначить), а readonly — ограничение на отдельные свойства объекта или элементы массива, но сама переменная может быть изменена (если допустимо контекстом).

Пример:

const arr: readonly number[] = [1, 2, 3]; // arr = [2, 3, 4]; // Ошибка из-за const // arr[0] = 5; // Ошибка из-за readonly

История

На проекте для финансовой платформы при работе с данными пользователей использовали обычные массивы number[] вместо readonly number[]. Из-за этого одна функция нечаянно изменила входные данные — значения сумм в массивах пользовались в разных местах, что привело к расхождению отчётов. Ошибка была обнаружена спустя несколько дней, что стоило компании времени на аудит и восстановление данных.


История

На внутреннем API перепутали const и readonly, решив, что const user: User предотвратит изменение полей. В результате оказалось возможным менять поля объекта, хотя это недопустимо по ТЗ. Из-за незнания разницы возникли утечки конфиденциальных данных между сервисами.


История

В составе open source-библиотеки одну из структур данных случайно сделали изменяемой, потому что забыли readonly в определении интерфейса. Это позволило сторонним разработчикам менять приватные данные в рантайме, из-за чего возникли баги, устранение которых потребовало рефакторинга.