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];
};

References