如何从typescript中的数组中提取类型?

时间:2017-04-21 08:21:46

标签: typescript types

有没有办法在typescript中声明一个'提取'数组内部类型的类型?

示例:

假设我的代码库中已有类似内容:

export interface Cache {
    events: Event[],
    users: User[]
}
type CacheType = Event[] | User[];

//or maybe: 
//   type TypeOfProperty = T[keyof T];
//   type CacheType = TypeOfProperty<Cache>; 

我想要的是与此相同的东西:

type InnerCacheType = Event | User;

但每次我向CacheCacheType添加内容时都不会手动重新输入

这在打字稿中是否可行?

1 个答案:

答案 0 :(得分:2)

假设您可以使用TypeScript 2.1或更高版本,否则无法实现您正在寻找的内容。

另外,请记住,您认为Cache接口的所有属性都是数组是理所当然的。如果情况并非如此,那么你的问题就变得毫无意义了,所以我也会做出这样的假设。

一般来说,CacheType可以写成

type CacheType = Cache[typeof Cache];

包括任何继承的属性。获得的类型等同于Event[] | User[],但是从这种联合类型中提取数组组件是不可行的。

解决方案是使用映射类型。您正在寻找的InnerCacheType可以写成

type InnerCacheType = MappedCacheType[typeof MappedCacheType];

,其中

type MappedCacheType = { [P in keyof Cache]: Cache[P][0]; };

实际上,最后一种类型相当于

{ events: Event; users: User; }

请注意,TypeScript会保留与原始名称相同的名称。

总结一下,在不考虑您的用例的情况下,表达数组类型T的组件类型的方式是T[0]