readonly в TypeScript

30 октября 2026
Автор

Дмитрий Нечаев

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

Курс по теме

Освоить TypeScript с нуля на курсе

40 000+ студентов · рейтинг 4.8 · гарантия возврата 30 дней

Давайте рассмотрим пример:

interface User {
  readonly id: number;
  name: string;
}

function displayUser(user: User) {
  console.log(`Пользователь с ID ${user.id} имеет имя ${user.name}.`);
  // user.id = 101; 
  // Ошибка: нельзя изменить 'id', так как это свойство 
  // только для чтения.
}

В примере выше, попытка изменения id приведёт к ошибке компиляции, что предотвратит возможные баги, связанные с некорректной мутацией данных.

Использование readonly позволяет защитить свойства объектов от случайного изменения и создавать более надежный код. Чтобы уверенно использовать readonly и создавать надежный код, необходимо глубокое понимание системы типов TypeScript. Приходите на наш большой курс TypeScript с нуля. На курсе 192 уроков и 17 упражнений, AI-тренажеры для безлимитной практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.

Внутреннее изменение объектов

Модификатор readonly не делает объект полностью неизменяемым; он лишь запрещает переназначение самого свойства. Внутренние атрибуты объекта могут быть изменены, если они не помечены как readonly.

Рассмотрим следующий пример:

interface House {
  readonly owner: { name: string; age: number };
}

function celebrateBirthday(house: House) {
  console.log(`С днем рождения, ${house.owner.name}!`);
  house.owner.age++; // Допустимо: 
  // мы можем изменять внутренние свойства объекта 'owner'.
}

function changeOwner(house: House) {
  // house.owner = { name: "Anna", age: 30 }; 
  // Ошибка: свойство 'owner' только для чтения.
}

Наследование и иммутабельность

TypeScript допускает присвоение обычных объектов переменным с типами, содержащими свойства только для чтения:

interface MutablePerson {
  name: string;
  age: number;
}

interface ImmutablePerson {
  readonly name: string;
  readonly age: number;
}

let person: MutablePerson = { name: "Alex", age: 30 };
let readonlyPerson: ImmutablePerson = person;

console.log(readonlyPerson.age); // Выводит: 30
person.age++;
console.log(readonlyPerson.age); // Выводит: 31

В данном случае, изменение свойства age в объекте person также отражается на readonlyPerson, поскольку обе переменные ссылаются на один и тот же объект в памяти.

Заключение

Использование readonly в TypeScript является мощным инструментом для обозначения намерений относительно неизменяемости свойств объектов. Это не только помогает в поддержании кода, но и уменьшает возможность ошибок, связанных с непреднамеренной мутацией данных. Однако важно понимать ограничения и поведение, связанные с модификатором readonly, чтобы эффективно его использовать.

Правильное использование readonly может значительно улучшить читаемость и поддерживаемость вашего кода. На нашем курсе TypeScript с нуля вы получите все необходимые знания и навыки для работы с TypeScript. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в TypeScript прямо сегодня.

Опциональные свойства в TypeScriptСтрелочка вправо

Постройте личный план изучения Typescript до уровня Middle — бесплатно!

Typescript — часть карты развития Frontend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по Typescript

Переменные и константы в TypeScriptTypeScript: ключевое слово using и Explicit Resource ManagementНастройка типов с declare module в TypeScriptTypeScript типизация в Node.js проектеTypeScript ESLint — настройка линтера для проектаTypeScript 5: новые возможности и измененияКортежи в TypeScripttsconfig.json — полный разбор настроек TypeScript компилятораTypeScript с tRPC — типобезопасный APIПреобразование к типу в TypeScript (Type Assertion)TypeScript strict и strictNullChecks — строгий режимБезопасные env переменные в TypeScriptКак собрать TypeScript проект с RollupОбъекты в TypeScriptMonorepo с Turborepo и TypeScriptIsolated Declarations в TypeScriptTypeScript с Hono: типобезопасный веб-фреймворкФункции в TypeScriptТип функции и стрелочные функции в TypeScriptТипизация ошибок и обработка исключений в TypeScriptTypeScript ключевое слово declareМассивы в TypeScript
Как правильно использовать тип UnknownTypeScript с Zod: генерация и валидация типовИспользование Union в TypeScriptTypeScript с GraphQL — типизация и кодогенерацияТипы данных в TypeScriptType Guards в TypeScript — как работает сужение типовСтруктурная типизация в TypeScriptNull и Undefined в TypeScriptSymbols в TypeScriptТип never в TypeScriptСужение типов (Narrowing) в TypeScriptПонимание Literal Types. Ключевые аспекты и примеры использованияОператор infer в Typescript?Типы функций в TypeScript. Руководство для разработчиковTypeScript с Express.js: типизация маршрутов и middlewareEnums vs Union Types в TypeScript: сравнение и выборEnums в TypeScriptДискриминированные объединения в TypeScriptСлужебный тип Awaited в TypeScriptКак типизировать массивы TypeScriptКак правильно использовать тип any
Вариативные кортежи (Variadic Tuple Types) в TypeScriptUtility Types в TypeScript — полный разбор встроенных утилитТипизация ответов API с fetch и generic-функцииtypeof в TypeScriptОператор satisfies в TypeScriptПаттерн Result для обработки ошибок без исключенийTemplate Literal Types в TypeScriptУтилитный тип NoInfer в TypeScriptMapped Types в TypeScriptОператор типа keyof в TypeScriptРуководство по тестированию TypeScript с JestТипы доступа по индексу в TypeScriptGenerics в TypeScriptconst assertions в TypeScriptУсловные типы в TypeScriptBranded Types в TypeScript — номинальная типизацияПродвинутые Conditional Types в TypeScript
Открыть базу знаний

Лучшие курсы по теме

изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

CSS Flexbox

Антон Ларичев
Гарантия
Бонусы
иконка звёздочки рейтинга4.9
бесплатно
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий