Завдання

Реалізуйте вбудований тип Omit<T, K>, який прийматиме об’єкт T та видалить з нього список ключів K. Наприклад:

interface Todo {
  title: string;
  description: string;
  completed: boolean;
}

type TodoPreview = MyOmit<Todo, "description" | "title">;

const todo: TodoPreview = {
  completed: false,
};

Розв’язок

Omit<T, K> приймає об’єкт T і список ключів в K, які треба виключити з об’єкта. Очевидно, що для вирішення цього завдання ми використаємо типи зіставлення.

type MyOmit<T, K> = { [P in keyof T]: T[P] };

Залишається відфільтрувати властивості, які необхідно залишити в об’єкті. Для цього використаємо перепризначення ключів в типах зіставлення:

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

В результаті ми отримаємо тип, який перебирає властивості з T та перевизначає ті, що не входять в K, на never. Таким чином, відфільтрувавши властивості вхідного об’єкта, ми отримаємо необхідний нам тип.

Посилання