Type Lookup
Проблема
Бывают ситуации, в которых нужно найти тип в объединении типов по его атрибутам.
В этой проблеме, реализуйте тип 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;
Комментарии