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:永远不要
。。。但是我怎样才能让二级考试成功。。。嗯