Модификатор readonly в классах

Тренажер по TypeScript для пользователей с начальным уровнем подготовки.

Тренажер по TypeScript

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

Свойства, помеченные как readonly, могут быть записаны только в момент объявления или внутри конструктора класса. Попытка изменить их в любом другом методе или снаружи класса приведет к ошибке компиляции. Это позволяет гарантировать неизменность важных данных, таких как идентификаторы (ID) или конфигурационные константы, делая код более надежным и предсказуемым.

В этом уроке вы научитесь:

  • Объявлять неизменяемые свойства в классах.
  • Отличать readonly (свойства) от const (переменные).
  • Использовать этот модификатор для защиты состояния объекта.
Список тем

1. Объявление readonly

id: 40703_ro_01_syntax

В этом задании вам нужно дополнить код класса User, добавив модификатор `readonly` к свойству `id`, чтобы запретить его изменение после инициализации. Это ключевая концепция TypeScript для создания неизменяемых свойств в классах. Ваша задача — вставить правильный модификатор в указанное место, чтобы код соответствовал синтаксису TypeScript и логике задания.

Заполните пропуски
class User {
  input1S id: number;
  name: string;

  constructor(id: number, name: string) {
    this.id = id;
    this.name = name;
  }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Изменение запрещено

id: 40703_ro_02_error

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

Найдите ошибку и исправьте
class UserProfile {
    readonly id: number;
    name: string;
    constructor(userId: number, userName: string) {
        this.id = userId;
        this.name = userName;
    }
    updateId(newId: number) {
        this.id = newId; // Ошибка: попытка изменить readonly свойство
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Конструктор и readonly

id: 40703_ro_03_select

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

Нужно правильно расставить в пропуски предложенные варианты
class Book {
  readonly title: string;
  
  constructor(newTitle: string) {
    input1S
  }
  
  changeTitle(newTitle: string): void {
    input2S
  }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Const vs Readonly

id: 40703_ro_04_compare

В этом задании вам предстоит сопоставить термины и понятия, связанные с модификаторами const и readonly в TypeScript. В левой колонке приведены названия конструкций и типов проверок, а в правой — их описания или характеристики. Сопоставьте каждый элемент левой колонки с соответствующим элементом правой. Обратите внимание, что в правой колонке нет лишних вариантов, но порядок элементов перемешан.

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
const
readonly
Runtime проверка
Compile-time проверка
Для переменных
readonly
Для свойств класса
const (частично)
Сообщения
Проверить
Показать подсказку

5. Неизменяемая конфигурация

id: 40703_ro_05_build

Из предложенных строк соберите корректное объявление класса Config на TypeScript, который имеет публичное readonly поле apiKey типа string и конструктор, принимающий этот ключ и сохраняющий его в поле. Класс должен быть готов к использованию, но не включайте в решение строки, которые создают экземпляр класса или выполняют другие действия, не относящиеся к объявлению класса.

Перетяните в правильном порядке строки из одного блока в другой
class Config {
    public readonly apiKey: string;
    constructor(apiKey: string) {
        this.apiKey = apiKey;
    }
}
const config = new Config('my-api-key');
config.apiKey = 'new-key';
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Поиск защищенных полей

id: 40703_ro_06_click

Внимательно изучите приведённый код класса на TypeScript. Ваша задача — найти и выделить кликом имена всех свойств (полей) этого класса, которые защищены от записи, то есть объявлены с использованием модификатора `readonly`. Не отмечайте имена методов, параметры конструктора, типы данных или свойства без модификатора `readonly`.

Кликните по всем фрагментам, которые подходят под условие задания.
class UserProfile {
  {{id~|~t1}}: number;
  public readonly {{username~|~t2}}: string;
  private {{email~|~t3}}: string;
  readonly {{createdAt~|~t4}}: Date;
  protected {{status~|~t5}}: boolean;

  constructor(id: number, username: string, email: string) {
    this.id = id;
    this.username = username;
    this.email = email;
    this.createdAt = new Date();
    this.status = true;
  }

  updateEmail(newEmail: string): void {
    this.email = newEmail;
  }
}
Сообщения
Проверить
Показать подсказку

7. Результат компиляции

id: 40703_ro_07_predict

Проанализируйте представленный фрагмент кода на TypeScript, в котором объявлен класс с полем, помеченным модификатором `readonly`. Обратите внимание на попытку изменения значения этого поля после создания экземпляра класса. Выберите, что произойдет при попытке компиляции и выполнения данного кода.

Выберите правильный вариант ответа
class User {
    readonly id: number;
    name: string;
    
    constructor(id: number, name: string) {
        this.id = id;
        this.name = name;
    }
}

const user = new User(1, "Alice");
user.id = 2; // Попытка изменить readonly поле
console.log(user.id);
Сообщения
Проверить
Показать подсказку

TypeScript: компиляция и запуск

id: 40703_compiler

Узнайте, как сделать данные в ваших классах «неприкосновенными» с помощью модификатора readonly. В этом примере мы создаем профиль пользователя, где уникальный ID и дата регистрации защищены от изменений после создания. Попробуйте раскомментировать строки с ошибками, чтобы увидеть, как TypeScript блокирует попытки изменить защищенные свойства. Добавьте свои собственные константные поля, например 'inn' или 'serialNumber', и проверьте, сможете ли вы их перезаписать внутри методов класса!

TS
Запустить тренажёр (TypeScript)
НайтиКурс.Ру