Pick
Завдання
Реалізуйте вбудований тип Pick<T, K>
не використовуючи його.
Він має створювати тип в котрому перераховані лише ті властивості T
, які
вказані в K
.
Наприклад:
interface Todo {
title: string;
description: string;
completed: boolean;
}
type TodoPreview = MyPick<Todo, "title" | "completed">;
const todo: TodoPreview = {
title: "Clean room",
completed: false,
};
Розв’язок
Для цієї задачі нам потрібні типи пошуку (Lookup Types) та типи зіставлення (Mapped Types).
Типи пошуку дозволяють нам отримати тип з іншого типу за іменем. Схоже на отримання значення з об’єкта за ключем.
Порівняльні типи дозволяють перетворити властивості типу в новий тип.
Ви можете прочитати більше про них і зрозуміти як вони працюють на сайті TypeScript: типи пошуку (lookup types) і типи зіставлення.
Тепер, знаючи про типи пошуку та порівняльні типи, як реалізувати необхідний тип?
Потрібно взяти всі елементи з об’єднання K
та проітерувавши над T
повернути
новий тип який буде складатись лише з їх ключів, що вказані в K
.
Типи значень цих ключів не зміняться. Хоча, нам доведеться взяти їх з
початкового T
і для цього будуть корисні типи пошуку:
type MyPick<T, K extends keyof T> = { [P in K]: T[P] };
Ми кажемо: “Візьми всі елементи з К
, назви Р
і зроби це ключем в новому
об’єкті зі значенням з початкового типу”. Це складно зрозуміти одразу, тому,
якщо щось не зрозуміло, спробуйте перечитати ще раз і розібрати рішення крок за
кроком.
Коментарі