type X = {} & {a: A} & {b: B} & ...
Пустой объект был нужен, так как
{x: X} генерился по условию, в зависимости от заранее описанной спекиНо вот какая засада:
type X = {} - это не пустой объект. Я даже не помню что это, но точно не пустой объект. ESlint-typescript для таких выражений рекомендует Record<string, never>, но это ломает первое выражение.Но есть пакет, содержащий утилити типы, которые работают так как вы ожидаете: https://github.com/sindresorhus/type-fest
К примеру, пустой объект тут выглядит уже нормально https://github.com/sindresorhus/type-fest/blob/main/source/empty-object.d.ts
Не горячо, но советую. Упрощает жизнь, так как можно забыть о тупняках тайпскрипта.