Я хочу иметь тип, который соответствует каждому типу объединения, но не любому объединению этих отдельных типов.

Предположим, у меня определены следующие типы:

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 составляющими.


person Kamil Szot    schedule 30.05.2020    source источник


Ответы (1)


Кажется, это именно то, что я хочу:

type S<T> = [T] extends (T extends All ? [T] : never) ? T : never;
person Kamil Szot    schedule 30.05.2020