Merge

Challenge

Merge two types into a new type. Keys of the second type overrides keys of the first type.

For example

type foo = {
  name: string;
  age: string;
};
type coo = {
  age: number;
  sex: string;
};

type Result = Merge<foo, coo>; // expected to be {name: string, age: number, sex: string}

Solution

Diese Herausforderung ähnelt stark der Append to Object-Herausforderung. Dort hat man die Eigenschaften beider Objekte mittels einer Vereinigung iteriert und einen Mapped Type erstellt. Gleiches können wir auch hier tun.

type Merge<F, S> = {
  [Key in keyof F | keyof S]: TODO;
};

Da in der Aufgabenstellung steht, dass Attribute des zweiten Eingabetypen priorisiert wird, prüfen wir immer zuerst, ob S[Key] existiert und nehmen diesen Wert, falls er vorhanden ist. Zusätzlich müssen wir natürlich immer noch prüfen, ob eine Eigenschaft / Schlüssel auch in S oder F existiert, ehe wir auf einen Wert zugreifen können.

type Merge<F, S> = {
  [Key in keyof F | keyof S]: Key extends keyof S
    ? S[Key]
    : Key extends keyof F
    ? F[Key]
    : never;
};

References