Ключевое слово 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 в определении интерфейса. Это позволило сторонним разработчикам менять приватные данные в рантайме, из-за чего возникли баги, устранение которых потребовало рефакторинга.