Typescript: получение информации о типе элемента из типа массива
Скажем, у меня есть тип массива T[]
, можно ли извлечь тип T
в другой псевдоним/интерфейс? Например, мой (фальшивый) идеальный код будет выглядеть следующим образом:
// for illustration only...
type ArrayElement<T[]> = T;
// then, ArrayElement<string[]> === string
Если нет, существуют ли причины общего типа, чтобы не допускать такого оператора? Если нет, я могу предложить добавить его.
Спасибо!
Ответы
Ответ 1
Начиная с 2.1, typcript поддерживает оператор [] для типов. Официальное имя - это индексированные типы доступа, также называемые типами поиска, и оно работает так:
type A = {a: string, b: number} [];
type AElement = A[0];
let e: AElement = {x: 0}; //error TS2322: Type '{ x: number; }' is not
//assignable to type '{ a: string; b: number; }'
Ответ 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