Создать тип объединения на основе массива типов - PullRequest
1 голос
/ 06 октября 2019

Можно ли определить тип объединения следующим образом:

Union<T extends any[]> = // something...

и будет использоваться как

Union<[string, number]> // would create (string | number)

Я знаю, что могу сразу определить объединение выше, но оно мне нужно дляиспользование в дженериках, где это в конечном итоге будет что-то вроде Union<[TDynamic, UDynamic]>

1 Ответ

1 голос
/ 06 октября 2019

Вы можете использовать следующий тип:

type Union<T extends any[]> = T extends (infer U)[] ? U : never;

Это фактически тот же тип, что и Unpacked, определенный в документах , и работает, потому что кортеж типа становится типомunion в этом случае.

type X1 = Union<[number, string]>; // string | number
type X2 = Union<[number, number]>; // number
type X3 = Union<[number]>; // number

Если вы используете старую версию TypeScript, которая не поддерживает infer, вы также можете использовать:

type Union<T extends any[]> = T[number];
...