Утилита Readonly<T> позволяет создать новый тип на основе T, в котором все свойства становятся доступными только для чтения. Это полезно для защиты данных от случайных изменений (мутаций).
В отличие от const, который защищает саму переменную, Readonly защищает свойства объекта. Попытка переназначить поле такого объекта приведет к ошибке TypeScript.
Пример использования: let config: Readonly<Config> = { ... };. Теперь config.port = 8080 вызовет ошибку. В этом уроке мы научимся делать объекты неизменяемыми.
- Модуль 1: Введение в TypeScript
- Модуль 2: Примитивные типы
- Модуль 3: Специальные типы
- Модуль 4: Массивы
- Модуль 5: Кортежи (Tuples)
- Модуль 6: Объекты
- Модуль 7: Функции
- Модуль 8: Union типы
- Модуль 9: Литеральные типы
- Модуль 10: Type Aliases
- Модуль 11: Интерфейсы
- Модуль 12: Type Guards и Narrowing
- Модуль 13: Enums
- Модуль 14: Классы
- Модуль 15: Generics — основы
- Модуль 16: Generics — ограничения
- Модуль 17: Utility Types — базовые
- Модуль 18: Utility Types — работа с Union
- Модуль 19: Utility Types — функции
- Модуль 20: Type Assertions
- Модуль 21: Keyof и Typeof операторы
- Модуль 22: Mapped Types
- Модуль 23: Conditional Types
- Модуль 24: Discriminated Unions
- Модуль 25: Модули и типы
- Модуль 26: Declaration Files
- Модуль 27: Типизация асинхронного кода
- Модуль 28: Практические паттерны
1. Неизменяемые поля
Внимательно изучите приведённый фрагмент кода 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. Применение утилиты
В TypeScript утилита Readonly позволяет сделать все свойства объекта доступными только для чтения, что полезно для защиты данных от изменений. В этом задании вам нужно применить утилиту Readonly к интерфейсу Settings при объявлении нового типа. Дополните код, чтобы тип ReadonlySettings был эквивалентен интерфейсу Settings, но с защитой от записи. Обратите внимание на синтаксис применения утилит типов.
interface Settings {
theme: string;
volume: number;
}
type ReadonlySettings = input1S;3. Запрещенная запись
В данном фрагменте 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);4. Mutable vs Readonly
В левой колонке приведены фрагменты кода 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;5. Создание Readonly типа
Из предложенных строк соберите корректное определение типа в TypeScript, которое создаёт неизменяемую (immutable) версию типа Point с помощью утилитарного типа Readonly. Определение должно корректно использовать ключевые слова TypeScript и соответствующий синтаксис. Две строки являются лишними и не должны входить в решение.
typeImmutablePoint=Readonly<Point>Readonly<ImmutablePoint>Partial<Point>;6. Выбор утилиты
В данном фрагменте кода TypeScript определён тип Person с двумя свойствами. Необходимо выбрать из выпадающего списка подходящую утилиту, которая сделает все свойства этого типа доступными только для чтения (readonly). Обратите внимание на контекст: требуется запретить любое изменение значений свойств объекта после его создания.
type Person = {
name: string;
age: number;
};
// Сделать все свойства только для чтения
type ReadonlyPerson = input1S<Person>;7. Части типа
В данном задании вам необходимо разметить два ключевых элемента в строке кода TypeScript, используя предоставленные категории. Обратите внимание на объявление типа с использованием утилиты и её аргумента. Выберите для выделенных фрагментов соответствующий тип: имя утилиты или дженерик-аргумент.