Перейти к основному содержимому
Модуль 6 · Урок 2 из 212/14 в курсе~15 min
Уроки модуля (2/2)

Сопоставленные типы

Сопоставленные типы позволяют создавать новые типы путем преобразования свойств существующих одно за другим. Они построены на основе синтаксиса цикла над ключами с использованием оператора keyof.

TS
type Mapped<T> = {
  [P in keyof T]: T[P];
};

В этом примере показан сопоставленный тип, идентичный исходному: он перебирает каждый ключ P в keyof T и присваивает тот же тип T[P].


Модификаторы изменчивости и опциональности

Мы можем добавлять или удалять модификаторы, такие как readonly и ? (необязательно), добавляя к ним префикс + (добавление, по умолчанию) или - (удаление).

Например, чтобы удалить необязательность из всех свойств типа (сделав их обязательными):

TS
type Concrete<T> = {
  [P in keyof T]-?: T[P];
};

Модификатор -? удаляет флаг необязательности из каждого свойства.


Переназначение ключей с помощью as

В TypeScript 4.1+ вы можете переназначить ключи в отображаемом типе, используя предложение as и типы литералов шаблона.

TS
type WriteSetters<T> = {
  [K in keyof T as `set${Capitalize<string & K>}`]: (value: T[K]) => void;
};

Здесь мы меняем имя каждого свойства K на set[CapitalizedKey] и изменяем его тип на функцию установки.


Попробуйте сами

Упражнение 1. Создание свойств, допускающих значение NULL

Упражнение#ts.m6.l2.e1
Попыток: 0Загрузка…

Объявите общий отображаемый тип Nullable<T>, который принимает объект T и преобразует каждое свойство так, чтобы оно также могло принимать значение null (например, T[K] | null).

Загрузка редактора…
Показать подсказку

Используйте синтаксис [K в ключе T]: T[K] | нулевой; внутри объекта сопоставленного типа.

Решение доступно после 3 попыток

Упражнение 2. Генерация динамических геттеров с помощью as

Упражнение#ts.m6.l2.e2
Попыток: 0Загрузка…

Создайте сопоставленный тип с именем GetterNames<T>, который преобразует ключи объекта T, добавляя к ним префикс «get» и записывая исходный ключ с заглавной буквы (используйте Capitalize). Например, если ключ имеет имя, он должен стать getName. Установите тип свойств () => T[K].

Загрузка редактора…
Показать подсказку

Используйте как \`get\${Capitalize<string & K>}\` для переназначения ключа и () => T[K] в качестве типа возвращаемого значения свойства.

Решение доступно после 3 попыток