Mapped Types в TypeScript

2 минут читать
Разработка
typescript
Mapped Types в TypeScript

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

Объяснение:

  1. Интерфейс User: Определяет структуру пользователя с id, name и email.
  2. Mapped Type: Partial<T> берёт тип T и создаёт новый тип, где все свойства T становятся опциональными:
    • K in keyof T итерирует по ключам T
    • T[K] получает тип каждого свойства, а ? делает их опциональными
  3. Тип OptionalUser: Теперь все свойства (id, name, email) стали опциональными

Использование:

const user1: OptionalUser = {}; // Корректно - все свойства опциональны
const user2: OptionalUser = { name: "Alice" }; // Корректно
const user3: OptionalUser = { id: 1, email: "alice@example.com" }; // Корректно

Ресурсы

  1. Релиз TypeScript 2.1
  2. Mapped Types в документации
  3. Отличная статья о Mapped Types от Matt Pocock
  4. Подробный пост с крутыми примерами