有没有办法在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;
但每次我向Cache
或CacheType
添加内容时都不会手动重新输入
这在打字稿中是否可行?
答案 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]
。