Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про TypeScript: utility

Где могут быть полезны mapped types?

Этот вопрос проверяет знание механизма Mapped Types в TypeScript для программного преобразования существующих типов.

Короткий ответ

Mapped Types (отображаемые типы) полезны, когда вам нужно создать новый тип на основе старого, применив одно и то же преобразование ко всем свойствам исходного типа. Они идеально подходят для задач, где требуется сделать все свойства опциональными (Partial<T>), доступными только для чтения (Readonly<T>), или выбрать подмножество свойств по их именам. Это мощный инструмент для избежания рутинного дублирования кода при определении схожих типов.

Длинный ответ

Mapped Types позволяют итерироваться по ключам существующего типа и создавать на их основе новый тип.

Синтаксис и базовые примеры:

Синтаксис: { [P in K]: T }, где P — это каждый ключ из union-типа K, а T — тип, в который преобразуется свойство.

  1. Создание utility-типов:
    Стандартные утилиты TypeScript реализованы через Mapped Types.

    // Сделать все свойства опциональными
    type MyPartial<T> = {
      [P in keyof T]?: T[P];
    };
    
    // Сделать все свойства доступными только для чтения
    type MyReadonly<T> = {
      readonly [P in keyof T]: T[P];
    };
    
    interface User {
      name: string;
      age: number;
    }
    
    type PartialUser = MyPartial<User>; // { name?: string; age?: number; }
    type ReadonlyUser = MyReadonly<User>; // { readonly name: string; readonly age: number; }
  2. Изменение модификаторов свойств:
    Можно одновременно убирать или добавлять модификаторы readonly и ?.

    // Убрать опциональность и readonly со всех свойств
    type Concrete<T> = {
      -readonly [P in keyof T]-?: T[P];
    };
  3. Изменение типов свойств:
    Можно не просто копировать, но и преобразовывать тип каждого свойства.

    // Создать тип, где все свойства являются функциями, возвращающими void
    type EventHandlers<T> = {
      [P in keyof T as `on${Capitalize<string & P>}`]: () => void;
    };
    // Для типа { name: string; age: number } получим:
    // { onName: () => void; onAge: () => void; }

Вывод: Mapped Types — это инструмент для метапрограммирования в системе типов TypeScript. Они незаменимы для создания семейств связанных типов, обеспечения консистентности и сокращения шаблонного кода, особенно при работе с состояниями, конфигурациями и DTO (Data Transfer Objects).

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • TypeScript

    TypeScript

Ключевые слова

#utility

Подпишись на React Developer в телеграм