Предположим, у меня определены следующие типы:
type A = {a:number};
type B = {a:string};
type C = {a:boolean};
type All = A | B | C;
Теперь я хочу определить общий тип S
(без использования каких-либо типов _3 _, _ 4_ и C
в определении), который ведет себя следующим образом:
var a: S<A>; // a is actually of type A
var b: S<B>; // b is of type B
var c: S<C>; // c is of type C
var all: S<All>; // all is of type never
Для этого я могу определить S
вот так:
type S<T> = All extends T ? never : T;
Однако для меня этого недостаточно, потому что я тоже хочу, чтобы
var ab: S<A|B>; // ab should be type never but actually is A|B
var bc: S<B|C>; // bc should be type never but actually is B|C
var ca: S<C|A>; // ca should be type never but actually is C|A
Вопрос
Учитывая некоторый тип объединения, как определить общий тип, который может быть сопоставлен с каждой отдельной составляющей типа союза, но не может быть сопоставлен ни с каким объединением этих составляющих?
Решение также должно работать для типов профсоюзов с более чем 3 составляющими.