Что такое Mapped Types в TypeScript
Mapped Types (отображённые типы) в TypeScript позволяют создавать новые типы на основе существующих, перебирая ключи и модифицируя их.
Это как map() для типов — можно обойти каждый ключ объекта и задать для него нужное значение.
Синтаксис
type NewType = {
[Key in Union]: Type;
}
Key— имя переменной, представляющее текущий ключ из множестваUnion.Type— тип значения для каждого ключа.- Можно использовать
keyof, модификаторы (?,readonly), и utility types (Pick,Partial, и т.д.).
Примеры использования
Пример 1: Копия типа с другими значениями
type User = {
name: string;
age: number;
};
// Делаем тип, где все значения — boolean
type UserPermissions = {
[K in keyof User]: boolean;
};
// => { name: boolean; age: boolean }
Пример 2: Все поля опциональные (аналог Partial<T>)
type Optional<T> = {
[K in keyof T]?: T[K];
};
Использование
type User = { name: string; age: number };
type OptionalUser = Optional<User>;
// => { name?: string; age?: number }
Пример 3: Сделать все поля readonly (аналог Readonly<T>)
type ReadOnly<T> = {
readonly [K in keyof T]: T[K];
};
Пример 4: Убрать readonly
type Mutable<T> = {
-readonly [K in keyof T]: T[K];
};
Где используются Mapped Types
- При создании utility types (
Partial,Pick,Readonly,Recordи т.д.) - Для генерации динамических объектов с заранее известными ключами
- Для автоматического преобразования типов на основе других типов
- Для интроспекции типов на больших проектах (особенно с
GraphQL,API, Form-системами)