PassFront
  1. PassFront
  2. База знаний
  3. Utility Types

Что такое 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 позволяет менять имена ключей.

Другие вопросы раздела