Mapped Types (сопоставленные типы) позволяют создавать новые объектные типы на основе старых. Но что, если мы хотим не только изменить типы значений, но и переименовать ключи? Здесь на помощь приходит переназначение ключей (Key Remapping) с помощью ключевого слова as.
Синтаксис: [K in keyof T as NewKeyType]: T[K].
Чаще всего это используется вместе с шаблонными литералами (Template Literal Types) для автоматической генерации геттеров, сеттеров или переименования полей (например, добавление префикса get...). Это продвинутая техника, которая делает типизацию невероятно гибкой и мощной.
- Модуль 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. Ключевое слово as
В TypeScript для переименования ключей в mapped types используется ключевое слово `as`. В этом задании вам нужно дополнить код, который создает новый тип путём переименования ключей исходного типа. В выражении внутри квадратных скобок пропущены ключевые элементы синтаксиса. Вставьте пропущенные элементы, чтобы mapped type корректно определялся и переименовывал ключи, добавляя к ним префикс 'new_'. Обратите внимание на порядок пропусков: сначала оператор для перебора ключей, затем ключевое слово для их переименования.
type Original = { a: number; b: string; };
type Renamed = {
[K input1S keyof Original input2S `new_${K}`]: Original[K]
};2. Логика переименования
Проанализируйте TypeScript-код сверху и восстановите последовательность шагов, которые выполняет компилятор TypeScript при создании типа Getters с использованием key remapping (as). Шаги снизу перемешаны — расставьте их в правильном порядке, чтобы отразить логику преобразования ключей исходного типа в ключи нового типа.
type Person = {
name: string;
age: number;
location: string;
};
type Getters<T> = {
[K in keyof T as `get${Capitalize<string & K>}`]: () => T[K];
};
type PersonGetters = Getters<Person>;
// Результирующий тип PersonGetters будет:
// {
// getName: () => string;
// getAge: () => number;
// getLocation: () => string;
// }3. Синтаксическая ошибка
В этом фрагменте TypeScript-кода используется mapped type с переназначением ключей (key remapping), но допущена синтаксическая ошибка. В конструкции `[K in keyof T as ...]` пропущена часть синтаксиса или неверно использован Template Literal. Найдите и исправьте строку с ошибкой, чтобы тип корректно преобразовывал ключи объекта.
type User = { id: number; name: string;}; type UserWithPrefix = { [K in keyof User as `prefix_${K}`]: User[K];};4. Результат маппинга
Проанализируйте приведённый код TypeScript, использующий маппинг типов (Mapped Types) с ключевым словом `as` для преобразования ключей. Определите, какой ключ будет получен в итоговом типе для исходного поля `name`. Выберите один правильный вариант из предложенных.
type Original = { name: string; age: number };
type Getters = {
[K in keyof Original as `get${Capitalize<string & K>}`]: () => Original[K];
};
// Какой ключ будет у поля 'name' в типе Getters?5. Исключение ключей
Соберите из предложенных строк корректный TypeScript-код, который определяет тип ProductWithoutId, исключая ключ 'id' из исходного типа Product с помощью ключевого слова 'as'. Используйте mapped types и конструкцию 'as Exclude'. Одна строка является лишней и в решение входить не должна.
type Product = { id: string; name: string; price: number;};type ProductWithoutId = { [K in keyof Product as Exclude<K, 'id'>]: Product[K];}; id: string; // Лишняя строка, не должна быть в новом типе6. Части выражения
Внимательно изучите приведённый ниже код TypeScript, содержащий определение Mapped Type с использованием ключевого слова `as` для трансформации ключей. Ваша задача — отметить (кликнуть) три элемента: переменную итерации (K), выражение трансформации ключа (часть после `as`) и тип значения в результирующем объекте. Не отмечайте другие части кода, такие как имена типов, фигурные скобки, операторы или комментарии.
type {{Getters~|~t0}}<T> = {
[{{K~|~t1}} in keyof T as {{`get${Capitalize<string & K>}`~|~t2}}]: {{() => T[K]~|~t3}};
};
// Пример использования
type User = { name: string; age: number };
type UserGetters = Getters<User>;
// Результат: { getName: () => string; getAge: () => number }