Readonly

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

Тренажер по TypeScript

Утилита Readonly<T> позволяет создать новый тип на основе T, в котором все свойства становятся доступными только для чтения. Это полезно для защиты данных от случайных изменений (мутаций).

В отличие от const, который защищает саму переменную, Readonly защищает свойства объекта. Попытка переназначить поле такого объекта приведет к ошибке TypeScript.

Пример использования: let config: Readonly<Config> = { ... };. Теперь config.port = 8080 вызовет ошибку. В этом уроке мы научимся делать объекты неизменяемыми.

Список тем

1. Неизменяемые поля

id: 40723_ts_util_readonly_click_immutable

Внимательно изучите приведённый фрагмент кода TypeScript. Дан интерфейс User и тип ReadonlyUser, созданный с помощью утилитного типа Readonly. Ваша задача — отметить все обращения к свойствам объекта readonlyUser, попытка изменения которых вызовет ошибку компиляции TypeScript (все свойства, которые стали доступны только для чтения). Не отмечайте объявления типов, инициализацию объекта или изменения свойств обычного объекта regularUser.

Кликните по всем фрагментам, которые подходят под условие задания.
interface User {
  id: number;
  name: string;
}

type ReadonlyUser = Readonly<User>;

const readonlyUser: ReadonlyUser = { id: 1, name: 'John' };
const regularUser: User = { id: 2, name: 'Jane' };

{{readonlyUser.id~|~t1}} = 3;
{{readonlyUser.name~|~t2}} = 'Bob';
{{regularUser.name~|~t3}} = 'Alice';
Сообщения
Проверить
Показать подсказку

2. Применение утилиты

id: 40723_ts_util_readonly_replace_utility

В TypeScript утилита Readonly позволяет сделать все свойства объекта доступными только для чтения, что полезно для защиты данных от изменений. В этом задании вам нужно применить утилиту Readonly к интерфейсу Settings при объявлении нового типа. Дополните код, чтобы тип ReadonlySettings был эквивалентен интерфейсу Settings, но с защитой от записи. Обратите внимание на синтаксис применения утилит типов.

Заполните пропуски
interface Settings {
  theme: string;
  volume: number;
}

type ReadonlySettings = input1S;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Запрещенная запись

id: 40723_ts_util_readonly_error_assignment

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

Найдите ошибку и исправьте
interface Book {
  title: string;
  author: string;
}
 
const myBook: Readonly<Book> = {
  title: "The Great Gatsby",
  author: "F. Scott Fitzgerald"
};
 
myBook.title = "New Title";
 
console.log(myBook.title);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Mutable vs Readonly

id: 40723_ts_util_readonly_compare_mutability

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

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
const user = { name: "John" };
user.name = "Alex";
const user: Readonly<{ name: string }> = { name: "John" };
user.name = "Alex";
const user: { readonly name: string } = { name: "John" };
user.name = "Alex";
const arr: ReadonlyArray<number> = [1, 2, 3];
arr[0] = 4;
Успешная компиляция и выполнение
Ошибка компиляции: свойство объекта Readonly
Ошибка компиляции: изменение ReadonlyArray
Ошибка компиляции: свойство помечено readonly
Сообщения
Проверить
Показать подсказку

5. Создание Readonly типа

id: 40723_ts_util_readonly_build_definition

Из предложенных строк соберите корректное определение типа в TypeScript, которое создаёт неизменяемую (immutable) версию типа Point с помощью утилитарного типа Readonly. Определение должно корректно использовать ключевые слова TypeScript и соответствующий синтаксис. Две строки являются лишними и не должны входить в решение.

Перетяните в правильном порядке строки из одного блока в другой
type
ImmutablePoint
=
Readonly
<Point>
Readonly<ImmutablePoint>
Partial<Point>
;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Выбор утилиты

id: 40723_ts_util_readonly_select_correct_util

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

Нужно правильно расставить в пропуски предложенные варианты
type Person = {
  name: string;
  age: number;
};

// Сделать все свойства только для чтения
type ReadonlyPerson = input1S<Person>;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

7. Части типа

id: 40723_ts_util_readonly_highlight_keywords

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

Кликните по каждому выделенному фрагменту и выберите для него подходящий тип из списка под текстом.
type Config = {{Readonly~|~t1}}<{{ { port: number }~|~t2}}>;
Дженерик-аргумент
Имя утилиты
Сообщения
Проверить
Показать подсказку

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

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