Завдання

Реалізуйте загальний RequiredByKeys<T, K>, який приймає два аргументи типу T і K.

K визначає набір властивостей T, які мають бути обов’язковими. Якщо K не надано, він має зробити всі властивості обов’язковими, як звичайний Required<T>.

Розв’язок

В завданні нас просять позначити всі властивості, наявні в K, як обов’язкові. Отже, спочатку давайте виберемо всі ці властивості.

type RequiredProperties<T, K> = {
  [P in keyof T as P extends K ? P : never]-?: T[P];
};

Зверніть увагу, як ми використали -? у виразі вище. Це те, що ми називаємо Модифікатор на типах зіставлення. Це говорить TypeScript, що ми не хочемо, щоб жодна з властивостей мала модифікатор ?.

Тепер, коли у нас є обов’язкові властивості, давайте витягнемо всі властивості, які слід залишити без змін. Це набір властивостей, яких немає в K.

type MyOmit<F, S> = { [P in keyof F as P extends S ? never : P]: F[P] };

type EverythingFromTExceptK<T, K> = MyOmit<T, K>;

Так як ми маємо обидві частини нашого рішення, давайте об’єднаємо їх в один тип.

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

type RequiredByKeys<T, K = keyof T> = MyMerge<
  RequiredProperties<T, K> & EverythingFromTExceptK<T, K>
>;

Посилання