Уроки модуля (2/2)
Сопоставленные типы
Сопоставленные типы позволяют создавать новые типы путем преобразования свойств существующих одно за другим. Они построены на основе синтаксиса цикла над ключами с использованием оператора keyof.
type Mapped<T> = {
[P in keyof T]: T[P];
};В этом примере показан сопоставленный тип, идентичный исходному: он перебирает каждый ключ P в keyof T и присваивает тот же тип T[P].
Модификаторы изменчивости и опциональности
Мы можем добавлять или удалять модификаторы, такие как readonly и ? (необязательно), добавляя к ним префикс + (добавление, по умолчанию) или - (удаление).
Например, чтобы удалить необязательность из всех свойств типа (сделав их обязательными):
type Concrete<T> = {
[P in keyof T]-?: T[P];
};Модификатор -? удаляет флаг необязательности из каждого свойства.
Переназначение ключей с помощью as
В TypeScript 4.1+ вы можете переназначить ключи в отображаемом типе, используя предложение as и типы литералов шаблона.
type WriteSetters<T> = {
[K in keyof T as `set${Capitalize<string & K>}`]: (value: T[K]) => void;
};Здесь мы меняем имя каждого свойства K на set[CapitalizedKey] и изменяем его тип на функцию установки.
Попробуйте сами
Упражнение 1. Создание свойств, допускающих значение NULL
Объявите общий отображаемый тип Nullable<T>, который принимает объект T и преобразует каждое свойство так, чтобы оно также могло принимать значение null (например, T[K] | null).
Показать подсказку
Используйте синтаксис [K в ключе T]: T[K] | нулевой; внутри объекта сопоставленного типа.
Решение доступно после 3 попыток
Упражнение 2. Генерация динамических геттеров с помощью as
Создайте сопоставленный тип с именем GetterNames<T>, который преобразует ключи объекта T, добавляя к ним префикс «get» и записывая исходный ключ с заглавной буквы (используйте Capitalize). Например, если ключ имеет имя, он должен стать getName. Установите тип свойств () => T[K].
Показать подсказку
Используйте как \`get\${Capitalize<string & K>}\` для переназначения ключа и () => T[K] в качестве типа возвращаемого значения свойства.
Решение доступно после 3 попыток