Этот вопрос проверяет знание механизма Mapped Types в TypeScript для программного преобразования существующих типов.
Mapped Types (отображаемые типы) полезны, когда вам нужно создать новый тип на основе старого, применив одно и то же преобразование ко всем свойствам исходного типа. Они идеально подходят для задач, где требуется сделать все свойства опциональными (Partial<T>), доступными только для чтения (Readonly<T>), или выбрать подмножество свойств по их именам. Это мощный инструмент для избежания рутинного дублирования кода при определении схожих типов.
Mapped Types позволяют итерироваться по ключам существующего типа и создавать на их основе новый тип.
Синтаксис: { [P in K]: T }, где P — это каждый ключ из union-типа K, а T — тип, в который преобразуется свойство.
Создание 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; }Изменение модификаторов свойств:
Можно одновременно убирать или добавлять модификаторы readonly и ?.
// Убрать опциональность и readonly со всех свойств
type Concrete<T> = {
-readonly [P in keyof T]-?: T[P];
};Изменение типов свойств:
Можно не просто копировать, но и преобразовывать тип каждого свойства.
// Создать тип, где все свойства являются функциями, возвращающими 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).