Mapped Type в TypeScript — это новый тип, созданный из базового типа с помощью пользовательской утилиты для маппинга типов.
Создание новых типов через кастомный маппер — распространённая практика, соответствующая принципу DRY (Don’t Repeat Yourself). В TypeScript есть различные методы вывода новых типов, и кастомный маппинг один из них.
Маппер типов использует синтаксис индексной сигнатуры для преобразования юнион-типа и генерации нового типа.
Пример Mapped Type
Допустим, у нас есть интерфейс профиля пользователя:
interface User {
id: number;
name: string;
email: string;
}
Чтобы создать тип, где все свойства User становятся опциональными:
type Partial<T> = {
[K in keyof T]?: T[K];
};
type OptionalUser = Partial<User>;
Тип Partial был добавлен в утилиты в версии 2.1
Объяснение:
- Интерфейс User: Определяет структуру пользователя с
id,nameиemail. - Mapped Type:
Partial<T>берёт типTи создаёт новый тип, где все свойстваTстановятся опциональными:K in keyof Tитерирует по ключамTT[K]получает тип каждого свойства, а?делает их опциональными
- Тип OptionalUser: Теперь все свойства (
id,name,email) стали опциональными
Использование:
const user1: OptionalUser = {}; // Корректно - все свойства опциональны
const user2: OptionalUser = { name: "Alice" }; // Корректно
const user3: OptionalUser = { id: 1, email: "alice@example.com" }; // Корректно