对象上的TypeScrip类型递归递归、对象、类型、TypeScrip

由网友(称雄三界)分享简介:我有以下模块定义,它包含一个MetaData类型和一个将任意名称映射到子模块/嵌套模块的对象:type Module = {metaData: T;children: C;};type Children = {[key: string]: Module我有以下模块定义,它包含一个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>numberAllMetaData<B>number | booleanAllMetaData<A>number | boolean | string

php无极分类非递归 面试中的递归算法,先收藏没准哪天就用上了

这是我所拥有的:

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

阅读全文

相关推荐

最新文章