对象上的TypeScrip类型递归 [英] Typescript type recursion over object

查看:0
本文介绍了对象上的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>numberAllMetaData<B>number | booleanAllMetaData<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类型不起作用?

Playground link

推荐答案

您有两个错误。

  1. 第9行应使用CHILDREN[KEY]而不是MODULE
  2. 第9行应使用AllMetaData而不是ExtractMetaData

Playground

这篇关于对象上的TypeScrip类型递归的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆