Omit
Проблема
Реализовать встроенный Omit<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] };
Остается отфильтровать те свойства, которые необходимо оставить при переборе.
Для этого воспользуемся переназначением в сопоставляющих типах. В результате,
получим тип, который перебирает свойства из T
и переназначает те, что
находятся в K
на never
.
type MyOmit<T, K> = { [P in keyof T as P extends K ? never : P]: T[P] };
Комментарии