Typescript:从数组类型中检索元素类型信息

Typescript:从数组类型中检索元素类型信息,typescript,Typescript,假设我有一些数组类型T[],是否可以在另一个别名/接口中提取类型T?例如,我的(伪)理想代码如下: // for illustration only... type ArrayElement<T[]> = T; // then, ArrayElement<string[]> === string //仅用于说明。。。 类型数组元素=T; //然后,ArrayElement==字符串 如果否,是否有一般类型理论的理由不允许这样的运算符?如果没有,我可能会建议添加 谢

假设我有一些数组类型
T[]
,是否可以在另一个别名/接口中提取类型
T
?例如,我的(伪)理想代码如下:

// for illustration only...

type ArrayElement<T[]> = T;

// then, ArrayElement<string[]> === string
//仅用于说明。。。
类型数组元素=T;
//然后,ArrayElement==字符串
如果否,是否有一般类型理论的理由不允许这样的运算符?如果没有,我可能会建议添加


谢谢

自2.1以来,typescript支持类型的[]运算符。官方名称是,它的工作原理如下:

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; }'

更新:基于@jerico下面的回答

以下类型别名将返回数组或元组中元素的类型:

type ArrayElement<ArrayType extends readonly unknown[]> = 
  ArrayType extends readonly (infer ElementType)[] ? ElementType : never;
另一种选择:

type ArrayElement<A> = A extends readonly (infer T)[] ? T : never
type ArrayElement=A扩展为只读(推断T)[]?T:从来没有

实用程序类型库有一个用于此的类型(以及许多其他类型)

比如说

import { ValuesType } from 'utility-types';

type NumberArray = number[];
// Expect: number
type NumberItems = ValuesType<NumberArray>;
从“实用程序类型”导入{ValuesType};
类型numberraray=number[];
//期望值:数字
类型NumberItems=值类型;
另一个选项:

type Flatten<Type> = Type extends Array<infer Item> ? Item : Type;
type flant=type扩展数组?项目:类型;
有关
expert
的更多信息,请访问:

此实现从数组类型推断元素类型,而接受的答案推断数组中第一个元素的类型。我只是觉得它更优雅,但由于数组(通过其类型定义)保证只包含相同类型的元素,因此使用此解决方案没有任何技术优势。Typescript支持基于索引的数组元素类型,例如:
[number,string]
。因此,这个答案有一些优点,如
ArrayElement->number | string
这应该不再是公认的答案,正如所述,我同意@feichsim。如果启用了
--nouneCheckedIndexedAccess
标志,我的答案可能会有问题,而@jerico的答案不会。这就足够让我选择这个答案而不是我的答案了,这有点悲哀,因为
ArrayType[number]
更容易阅读,特别是对于初学者来说。当a可以为null时会发生什么?相同或类似的错误,因为type
{x:number;}
仍然与数组元素的类型不兼容赋值也可以执行
YourArray[number]
我认为这比
YourArray[0]
更一般这实际上是唯一一个真正的“正确”答案。我相信正是出于这个原因,它也是复杂类型的唯一工作方式,例如
P[]|(Q | R)[
如何使用它?你能编辑你的帖子并举个例子吗?当然,我更新了我的帖子
import { ValuesType } from 'utility-types';

type NumberArray = number[];
// Expect: number
type NumberItems = ValuesType<NumberArray>;
type Flatten<Type> = Type extends Array<infer Item> ? Item : Type;