Неждали, негадали, а я к вам сегодня в качестве #tip_of_the_day с новым приколом в Typescript.
Вот представим, у вас есть 2 объекта. И вам надо их помержить. Но мержить надо в случае, если второй объект не пустой (!== {}).
Первое решение пошло в лоб type IsEmpty = boolean // ???
// if obj2 === {} -> take only 1 object, otherwise merge T1 & T2 type Merged = IsEmpty extends true ? T1 : T1 & T2;
но в таком случае, любой объект удовлетворяет условию extends {}
Но тогда я подумал: а что отличает пустой объект от непустого. Правильно, наличие в нем ключей. Т.е. у пустого объекта нет ключей, а значит, что если у нас есть совпадение по пустым ключам, то перед нами как раз пустой объект.
type EMPTY_OBJECT = {} type IsEmpty = [keyof T] extends [keyof EMPTY_OBJECT] ? true : false;
type Test = IsEmpty<{}> // true type Test = IsEmpty<{asd: string}> // false
Ссылку на TS playground также оставлил
P.S. примечательно, что если из generic вынести EMPTY_OBJECT то тип перестает работать
P.P.S. Специально для вас нашел в истории классный видос касательно того, как в голове стоит собирать модели на мета типах(которые как в TS полны по тьюрингу. https://youtu.be/0BXuYlNrUmE?si=hZoZTnrqMsF9Q3Nj)
#tip_of_the_day #typescript #ts @haradkou_sdet