Это было раскрыто в примечаниях к выпуску, когда вывод типа из условных типов .Будет ли это объединение или пересечение, зависит от дисперсии предполагаемого типа.Интуитивно понятно, что если тип выводится как общий тип для нескольких значений, он может быть любым из них (объединение), но если он выводится как тип аргумента для нескольких функций, он должен быть приемлем для любой из них (пересечение).
Цитата из примечаний к выпуску:
В следующем примере показано, как несколько кандидатов на одну и ту же переменную типа в совпадающих позициях приводят к выводу типа объединения:
type Foo<T> = T extends { a: infer U, b: infer U } ? U : never;
type T10 = Foo<{ a: string, b: string }>; // string
type T11 = Foo<{ a: string, b: number }>; // string | number
Аналогичным образом, несколько кандидатов на одну переменную типа в противоположных позициях приводят к выводу типа пересечения:
type Bar<T> = T extends { a: (x: infer U) => void, b: (x: infer U) => void } ? U : never;
type T20 = Bar<{ a: (x: string) => void, b: (x: string) => void }>; // string
type T21 = Bar<{ a: (x: string) => void, b: (x: number) => void }>; // string & number
Дальнейшее обсуждение можно найти в PR реализует эту функцию.
В качестве примечания, он позволяет использовать некоторые интересные трюки, такие как объединение в тип пересечения .