Mapped Types (сопоставленные типы) позволяют создавать новые типы на основе старых, перебирая их ключи. Однако часто нам нужно не просто скопировать свойства, но и изменить их модификаторы: readonly (только для чтения) и ? (опциональность).
TypeScript предоставляет синтаксис для добавления (+) или удаления (-) этих модификаторов. Например, запись -readonly удаляет ограничение на запись, делая свойство изменяемым, а -? делает свойство обязательным, удаляя undefined из типа.
В этом тренажере вы попрактикуетесь в управлении модификаторами внутри Mapped Types для создания гибких утилитных типов.
- Модуль 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
- Основы Mapped Types.
- Модификаторы в Mapped Types (+, -).
- Key Remapping (as).
- Модуль 23: Conditional Types
- Модуль 24: Discriminated Unions
- Модуль 25: Модули и типы
- Модуль 26: Declaration Files
- Модуль 27: Типизация асинхронного кода
- Модуль 28: Практические паттерны
1. Значение модификаторов
В левой колонке приведены синтаксические конструкции модификаторов, используемых в Mapped Types TypeScript. В правой колонке — описания их действий. Сопоставьте каждый модификатор с соответствующим описанием. Обратите внимание, что в правой колонке описания перемешаны, и каждому модификатору соответствует ровно одно правильное действие.
-?+?-readonly+readonly2. Удаление опциональности
В этом задании вам предстоит поработать с mapped types в TypeScript, а именно с модификаторами для удаления опциональности. Имеется тип Person с опциональными полями. Ваша задача — дополнить определение типа Required
type Person = {
name?: string;
age?: number;
};
type Required<T> = {
[P in keyof T] input1S : T[P];
};
const person: Required<Person> = {
name: "Alice",
age: 30
};3. Создание Mutable типа
В этом задании вам нужно создать mapped type, который преобразует все поля переданного типа из readonly в изменяемые. Для этого необходимо выбрать правильный модификатор из выпадающего списка, чтобы убрать модификатор readonly. Обратите внимание на синтаксис mapped types и использование модификаторов + и -.
type ReadonlyPoint = {
readonly x: number;
readonly y: number;
};
type Mutable<T> = {
input1S [P in keyof T]: T[P]
};
type Point = Mutable<ReadonlyPoint>;
// Теперь Point должен быть { x: number; y: number; } без readonly4. Конструктор типов
Из предложенных строк соберите корректное определение типа TypeScript, который делает все поля объекта только для чтения (readonly) и обязательными (удаляет опциональность). Используйте mapped types с модификаторами + и -. Некоторые строки лишние и не должны входить в решение.
type ReadonlyRequired<T> ={+readonly[P in keyof T]-?T[P];}readonly[P in keyof T]?T[P]5. Результат трансформации
Проанализируйте приведённый фрагмент кода TypeScript. Исходный интерфейс содержит опциональные поля. Используется mapped type с модификатором '-?'. Определите, как будет выглядеть итоговый тип после трансформации. Выберите правильное описание результирующего типа.
// Исходный интерфейс с опциональными полями
interface UserProfile {
id?: number;
username?: string;
email?: string;
isActive?: boolean;
}
// Mapped type с модификатором '-?'
type RequiredUserProfile = {
[K in keyof UserProfile]-?: UserProfile[K];
};
// Пример использования
// const profile: RequiredUserProfile = { ... };6. Логика работы Mapped Type
Проанализируйте TypeScript-код сверху и восстановите последовательность логических шагов выполнения программы. Шаги снизу перемешаны — расставьте их в правильном порядке, чтобы отразить, как компилятор обрабатывает mapped type с модификаторами и формирует итоговый тип.
type MutableRequired<T> = {
-readonly [P in keyof T]-?: T[P]
};
interface User {
readonly id: number;
name?: string;
readonly email?: string;
}
type MutableUser = MutableRequired<User>;7. Ошибка синтаксиса
В данном фрагменте кода TypeScript используется mapped type с модификаторами, но допущена синтаксическая ошибка в указании модификатора. Исправьте строку с ошибкой, чтобы mapped type корректно применял модификаторы к свойствам типа.
type User = { name: string; age: number;};type ReadonlyUser = { readonly- [K in keyof User]: User[K] };