Omit
Challenge
Implement the built-in Omit<T, K> generic without using it.
Constructs a type by picking all properties from T and then removing K
For example
interface Todo {
title: string;
description: string;
completed: boolean;
}
type TodoPreview = MyOmit<Todo, "description" | "title">;
const todo: TodoPreview = {
completed: false,
};
Solution
Aus den vorherigen Herausforderungen wissen wir, dass, wenn wir mit Objekt-Typen arbeiten und einen Objekt-Typ erweitern / ändern wollen, ein Mapped Type entsteht / entstehen soll. Bevor wir nun einen solchen erstellen, schauen wir uns kurz die Typdefinition an:
// T soll einem Object entsprechen, K muss ein Attribut aus T sein
type MyOmit<T extends Record<string, any>, K extends keyof T>
Durch die Nutzung des Utility-Typs Exclude können wir alle Eigenschaften von „T“ entfernen, die in in den zu entfernenden Attributen K enthalten sind. Anschließend iterieren wir wieder ueber die nun verbliebenen Eigenschaften und erzeugen damit einen Mapped type.
type MyOmit<T extends Record<string, any>, K extends keyof T> = {
[Key in Exclude<keyof T, K>]: T[Key];
};