Вы можете использовать следующий тип:
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];