由网友(称雄三界)分享简介:我有以下模块定义,它包含一个MetaData类型和一个将任意名称映射到子模块/嵌套模块的对象:type Module = {metaData: T;children: C;};type Children = {[key: string]: Module我有以下模块定义,它包含一个![php无极分类非递归 面试中的递归算法,先收藏没准哪天就用上了](https://p.xsw88.cn/allimgs/daicuo/20230903/4135.png)
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
。
![php无极分类非递归 面试中的递归算法,先收藏没准哪天就用上了](https://p.xsw88.cn/allimgs/daicuo/20230903/4135.png)
这是我所拥有的:
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
类型不起作用?
Playground link
推荐答案
您有两个错误。
第9行应使用CHILDREN[KEY]
而不是MODULE
第9行应使用AllMetaData
而不是ExtractMetaData
Playground
相关推荐
最新文章