Readonly свойства

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

Тренажер по TypeScript

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

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

В этом уроке мы разберем:

  • Синтаксис добавления модификатора в интерфейсы и типы.
  • Разницу между const (для переменных) и readonly (для свойств).
  • Поведение компилятора при попытке перезаписи защищенных полей.

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

Список тем

1. Объявление интерфейса

id: 40647_readonly_select_fill_intro

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

Нужно правильно расставить в пропуски предложенные варианты
interface User {
  input1S id: number;
  name: string;
  email: string;
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Попытка изменения

id: 40647_readonly_error_assignment

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

Найдите ошибку и исправьте
interface User {
  readonly id: number;
  name: string;
}
 
const currentUser: User = { id: 1, name: 'Alice' };
currentUser.id = 2;
currentUser.name = 'Bob';
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Readonly в Type Alias

id: 40647_readonly_replace_type_alias

В TypeScript для защиты свойств объекта от изменений используется модификатор readonly. В этом задании объявлен псевдоним типа (type) для конфигурации приложения. Ваша задача — добавить модификатор readonly перед свойством apiKey, чтобы сделать его доступным только для чтения. Это предотвратит случайное изменение критически важного ключа API в коде. Вставьте нужное ключевое слово в отмеченное место, чтобы тип AppConfig корректно описывал неизменяемое свойство apiKey и изменяемое endpoint.

Заполните пропуски
type AppConfig = {
  input1S apiKey: string;
  endpoint: string;
};

const config: AppConfig = {
  apiKey: '12345-abcde',
  endpoint: 'https://api.example.com'
};

// config.apiKey = 'new-key'; // Эта строка вызовет ошибку компиляции, если apiKey readonly
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Выбор защищенных полей

id: 40647_readonly_click_target_safe

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

Кликните по всем фрагментам, которые подходят под условие задания.
interface UserProfile {
  {{readonly~|~t0}} {{id~|~t1}}: {{number~|~t2}};
  {{username~|~t3}}: {{string~|~t4}};
  {{email~|~t5}}: {{string~|~t6}};
  {{readonly~|~t7}} {{createdAt~|~t8}}: {{Date~|~t9}};
  {{age~|~t10}}?: {{number~|~t11}};
}
Сообщения
Проверить
Показать подсказку

5. Поверхностная неизменяемость

id: 40647_readonly_predict_shallow

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

Выберите правильный вариант ответа
interface Config {
    readonly data: number[];
}

const config: Config = {
    data: [10, 20, 30]
};

// Попытка изменить массив
config.data.push(40);

console.log(config.data);
Сообщения
Проверить
Показать подсказку

6. Сборка безопасного интерфейса

id: 40647_readonly_build_interface

Из предложенных строк соберите интерфейс Transaction с полями: id (число), amount (только для чтения, число), sender (только для чтения, строка) и receiver (строка). Поля должны быть объявлены именно в таком порядке. Лишние строки не используйте.

Перетяните в правильном порядке строки из одного блока в другой
interface Transaction {
  id: number;
  readonly amount: number;
  readonly sender: string;
  receiver: string;
}
  amount: number;
  sender: string;
  receiver: readonly string;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

7. Анализ жизненного цикла объекта

id: 40647_readonly_analyze_usage

Проанализируйте TypeScript-код сверху и восстановите последовательность шагов, описывающих жизненный цикл объекта с readonly свойством. Шаги снизу перемешаны — расставьте их в правильном порядке, чтобы отразить, как программа объявляет тип, создаёт объект, читает свойства и пытается изменить readonly свойство.

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

const user: User = { id: 1, name: "Alice" };

console.log(user.id);
console.log(user.name);

// user.id = 2; // Ошибка компиляции: Cannot assign to 'id' because it is a read-only property.
Расположите элементы в логичном порядке
Объявление интерфейса User, в котором свойство id помечено как readonly, а name — обычное
Чтение значения readonly свойства id (вывод в консоль с помощью console.log)
Инициализация объекта user: создание константы user типа User с начальными значениями id=1 и name="Alice"
Чтение значения обычного свойства name (вывод в консоль с помощью console.log)
Попытка присвоить новое значение свойству id (эта строка вызовет ошибку компиляции, так как id — readonly)
Сообщения
Проверить
Показать подсказку

8. Разметка синтаксиса

id: 40647_readonly_highlight_parts_syntax

Разметьте синтаксис объявления свойства в интерфейсе TypeScript. Укажите для каждого выделенного фрагмента, является ли он модификатором readonly, именем свойства или типом данных. Это поможет закрепить понимание структуры объявления свойств в объектных типах.

Кликните по каждому выделенному фрагменту и выберите для него подходящий тип из списка под текстом.
interface User {
  {{readonly~|~t1}} {{id~|~t2}}: {{number~|~t3}};
}
Имя свойства
Тип данных
Модификатор readonly
Сообщения
Проверить
Показать подсказку

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

id: 40647_compiler

Изучите, как модификатор `readonly` делает свойства объекта доступными только для чтения, предотвращая их случайное изменение. В этом примере мы создали объект пользователя с защищенным идентификатором. Попробуйте раскомментировать строку с изменением `id` или добавьте свое собственное неизменяемое свойство, например `serialNumber`, чтобы увидеть, как TypeScript строго следит за безопасностью ваших данных. Экспериментируйте: создайте интерфейс для настроек приложения, которые нельзя менять во время работы программы!

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