Merge
Проблема
Слить два типа в один. Ключи второго типа переопределяют ключи из первого. Например:
type Foo = {
  a: number;
  b: string;
};
type Bar = {
  b: number;
};
type merged = Merge<Foo, Bar>; // expected { a: number; b: number }
Решение
Эта проблема напомнила мне “Append to Object”. Мы использовали объединения типов, чтобы собрать все свойства объекта и строку в один тип.
Такой же трюк проделаем и здесь. Возьмем ключи первого и второго типов и после объединим их. В результате, получим объект, в котором ключи из первого и второго типов.
type Merge<F, S> = { [P in keyof F | keyof S]: never };
Имея ключи двух объектов, начнём проставлять типы их значений. Начинаем с типа
S, потому что у него выше приоритет, он переопределяет свойство из типа F.
Для этого, проверяем, а есть ли свойство на типе S. Если да, через индексы
поиска получаем тип его значения.
type Merge<F, S> = {
  [P in keyof F | keyof S]: P extends keyof S ? S[P] : never;
};
В случае, свойства нету, проверяем есть ли такое же свойство на типе F. И если
да, берём тип значения оттуда.
type Merge<F, S> = {
  [P in keyof F | keyof S]: P extends keyof S
    ? S[P]
    : P extends keyof F
    ? F[P]
    : never;
};
Комментарии