Завдання

Бувають ситуації, коли потрібно знайти тип в об’єднанні типів за його атрибутами. В цьому завданні, реалізуйте тип LookUp<U, T>, який шукає в U тип, поле type якого є T. Наприклад:

interface Cat {
  type: "cat";
  breeds: "Abyssinian" | "Shorthair" | "Curl" | "Bengal";
}

interface Dog {
  type: "dog";
  breeds: "Hound" | "Brittany" | "Bulldog" | "Boxer";
  color: "brown" | "white" | "black";
}

type MyDogType = LookUp<Cat | Dog, "dog">; // expected to be `Dog`

Розв’язок

Перевіримо, що тип привласнюється іншому типові з атрибутами { type: T } за допомогою умовних типів. А оскільки умовні типи — дистрибутивні на об’єднаннях, то ця перевірка буде виконуватися для кожного елементу з об’єднання. Отже, ми переберемо всі елементи, поки не знайдемо потрібний.

type LookUp<U, T> = U extends { type: T } ? U : never;

Посилання