Что такое mapped types и как написать свой utility-тип?
Utility Types
Mapped type перебирает ключи другого типа и создаёт новый тип, преобразуя каждое свойство.
Синтаксис
type MyPartial<T> = {
[K in keyof T]?: T[K];
};
type MyReadonly<T> = {
readonly [K in keyof T]: T[K];
};Модификаторы
Знак - убирает модификатор, + добавляет:
type Mutable<T> = { -readonly [K in keyof T]: T[K] };
type Concrete<T> = { [K in keyof T]-?: T[K] };Переименование ключей
type Getters<T> = {
[K in keyof T as `get${Capitalize<string & K>}`]: () => T[K];
};
type G = Getters<{ name: string }>; // { getName: () => string }Рекурсия
type DeepReadonly<T> = {
readonly [K in keyof T]: T[K] extends object ? DeepReadonly<T[K]> : T[K];
};Коротко для собеседования
Mapped type пробегает по keyof T и пересобирает свойства. Так устроены Partial, Readonly, Pick, а as позволяет менять имена ключей.