Typescript 来自对象的所有嵌套值的类型

Typescript 来自对象的所有嵌套值的类型,typescript,Typescript,我想知道是否有更好的方法来获取对象的所有类型的嵌套值。特别是我的情况可以概括为这样的情况: const myObj={ 第一组:{ 子群11:()=>{return{}as const}, 子群12:()=>{return{}as const}, ... }, 第2组:{ 子群21:()=>{return{}as const}, 子群22:()=>{return{}as const}, ... } ... } 所有最终值都是函数 我目前所做的是详尽无遗的,因此我从每个嵌套属性中获取所有类型:

我想知道是否有更好的方法来获取对象的所有类型的嵌套值。特别是我的情况可以概括为这样的情况:

const myObj={
第一组:{
子群11:()=>{return{}as const},
子群12:()=>{return{}as const},
...
},
第2组:{
子群21:()=>{return{}as const},
子群22:()=>{return{}as const},
...
}
...
}
所有最终值都是函数

我目前所做的是详尽无遗的,因此我从每个嵌套属性中获取所有类型:

类型myType=
注:

  • 属性名称的索引表示法仅用于示例

  • 这些组不一定具有相同的属性

  • 答案更新:


    检查并回答问题,因为它们绝对正确。后一种方法检查深度达2级的对象类型,而第一种方法递归地工作到任何深度,还请注意,最后一种方法即使值不是函数也可以工作。感谢Maciej、leonard和jcalz的贡献。

    您应该结合使用映射类型、推理和伪递归。类似于
    T[K][keyof T[K]]
    的东西,使用推理不仅可以得到R(返回类型),甚至可以找到级别1的属性是函数还是级别2(“组”对象),如下所示:

    type FlattenTwoLevels<T extends {}> = {
        [K in keyof T]: T[K] extends (...args: any) => any ? T[K] : T[K][keyof T[K]]
    }[keyof T];
    
    type ReturnMyObj = ReturnType<FlattenTwoLevels<typeof myObj>>;
    
    type-levels={
    [K in keyof T]:T[K]扩展(…args:any)=>any?T[K]:T[K][keyof T[K]]
    }[keyof T];
    类型ReturnMyObj=ReturnType;
    
    我省略了
    (…args:any)=>inferr
    推断,因为
    ReturnType
    在这里已经默认工作了,所以
    flatttwolevels
    通用帮助器只需要使对象可由
    ReturnType
    使用


    下面是我们可以创建一个泛型类型的

    ,它可以处理任何嵌套结构。给你

    type SelectFunctionRetunTypes<T extends object> =
        {
            [K in keyof T]
            : T[K] extends (...args: any) => any
            ? ReturnType<T[K]>
            : T[K] extends object
                ? SelectFunctionRetunTypes<T[K]>
                : T[K] // primary value not a function and not an object  
        }[keyof T]
    
    type ReturnsMyObj = SelectFunctionRetunTypes<typeof myObj>;
    
    type SelectFunctionRetunTypes=
    {
    [K in keyof T]
    :T[K]扩展(…参数:any)=>any
    ?返回式
    :T[K]扩展对象
    ?选择FunctionRetuntypes
    :T[K]//主值不是函数也不是对象
    }[keyof T]
    type ReturnsMyObj=SelectFunctionRetunTypes;
    
    SelectFunctionRetunTypes是递归类型,当我们的值
    T[K]
    是函数类型时,我们通过
    ReturnType
    type级别的函数从中获取返回类型,如果它不是函数,我们检查它是否是对象,如果是,我们通过递归调用SelectFunctionRetunTypes在该对象中继续相同的算法。最后一部分是当它不是函数也不是对象时,在这种情况下,我们只返回一种类型的值

    此泛型类型与所有类型的嵌套对象类型一起工作,如果值类型是函数,它将给出返回类型,如果不是,则只给出值类型


    中的完整示例您需要这两个级别吗?像
    type ReturnTypeNested2Levels={[K in keyof T]:T[K][keyof T[K]}[keyof T]扩展(…args:any)=>推断R?R:从来没有?或者你需要一种可以递归工作任意级别的东西?请注意,任意版本要么必须在某个固定深度跳出,要么使用一些不受支持的递归条件类型hank you@jcalz进行响应。1级或2级。因此,我试图创建一个
    ReturnTypeNested1Level
    并调整您的
    ReturnTypeNested2Levels
    以便
    myType
    可以
    ReturnTypeNested2Levels | ReturnTypeNested1Level
    。。。我必须以某种方式排除未知。。?!?我正在努力做到这一点
    ReturnTypeNested1Level
    应该是
    T[keyof T]extends(…args:any)=>推断R?R:永远不要
    。。。但是我怎样才能让二级考试成功。。。嗯