Typescript: получение информации о типе элемента из типа массива

Скажем, у меня есть тип массива T[], можно ли извлечь тип T в другой псевдоним/интерфейс? Например, мой (фальшивый) идеальный код будет выглядеть следующим образом:

// for illustration only...

type ArrayElement<T[]> = T;

// then, ArrayElement<string[]> === string

Если нет, существуют ли причины общего типа, чтобы не допускать такого оператора? Если нет, я могу предложить добавить его.

Спасибо!

Ответ 2

Вы можете достичь этого с помощью следующего:

type ArrayElement<ArrayType extends readonly unknown[]> = ArrayType[number];

Таким образом, эти примеры будут работать:

type X = ArrayElement<string[]>; // string
type Y = ArrayElement<readonly string[]>; // string
type Z = ArrayElement<[string, number]>; // string | number

объяснение

ArrayType extends readonly unknown[] говорит, что мы ожидаем, что параметр типа ArrayType будет по крайней мере массивом ArrayType для ArrayType (он также принимает изменяемый массив), чтобы мы могли посмотреть на его тип элемента.

Обратите внимание, что readonly unknown[] - это синтаксис, добавленный в TypeScript 3.4; для более ранних версий используйте ReadonlyArray<unknown>.

С правой стороны ArrayType[number] означает любое значение в массиве, доступное по числовому индексу, то есть любое значение в массиве.

Ответ 3

Другая альтернатива:

type ArrayElement<A> = A extends readonly (infer T)[] ? T : never