对象上的TypeScrip类型递归 [英] Typescript type recursion over object
本文介绍了对象上的TypeScrip类型递归的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有以下模块定义,它包含一个MetaData
类型和一个将任意名称映射到子模块/嵌套模块的对象:
type Module<T, C extends Children> = {
metaData: T;
children: C;
};
type Children = {
[key: string]: Module<any, any>;
}
type ExtractMetaData<M extends Module<any, any>> = M extends Module<infer T, any> ? T : never;
type ExtractChildren<M extends Module<any, any>> = M extends Module<any, infer C> ? C : never;
现在,假设我定义了三个简单的模块:A、B和C,因此C是B的子级,B是A的子级:
type C = Module<number, {}>;
type B = Module<boolean, {
c: C;
}>;
type A = Module<string, {
b: B;
}>;
我需要的是一个实用程序类型AllMetaData<T extends Module>
,它将返回模块树中所有MetaData
类型的并集。例如,AllMetaData<C>
为number
,AllMetaData<B>
为number | boolean
,AllMetaData<A>
为number | boolean | string
。
这是我所拥有的:
type AllMetaData<
MODULE extends Module<any, any>,
CHILDREN = ExtractChildren<MODULE>,
METADATA = ExtractMetaData<MODULE>,
> =
| METADATA
| {
[KEY in keyof CHILDREN]: CHILDREN[KEY] extends Module<any, any>
? ExtractMetaData<MODULE>
: never;
}[keyof CHILDREN];
但它似乎不起作用,因为当我定义此类型时:
type Result = AllMetaData<A>;
Result
等同于string
,它应该是A的树中所有MetaData
类型的并集。
为什么我的AllMetadata
类型不起作用?
推荐答案
您有两个错误。
- 第9行应使用
CHILDREN[KEY]
而不是MODULE
- 第9行应使用
AllMetaData
而不是ExtractMetaData
这篇关于对象上的TypeScrip类型递归的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文