Перейти до основного вмісту
Модуль 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: Зробити властивості Nullable

вправи#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» і вводячи початковий ключ з великої літери (використовуйте «Введення з великої літери»). Наприклад, якщо ключ є name, він має стати getName. Встановіть тип властивостей () => T[K].

Завантаження редактора…
Показати підказку

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

Рішення доступне після 3 спроб