Typescript 解包的递归版本<;T>;打字稿?

Typescript 解包的递归版本<;T>;打字稿?,typescript,Typescript,请参阅中的解包 type解包= T扩展(推断U)[]?U: T扩展(…args:any[])=>推断U?U: 你不承诺吗?U: T 有递归版本吗? 我已经试过了,我得到了循环引用本身的错误 type Unpacked<T> = T extends (infer U)[] ? Unpacked<U> : T extends (...args: any[]) => infer U ? Unpacked<U> : T extends

请参阅中的
解包

type解包=
T扩展(推断U)[]?U:
T扩展(…args:any[])=>推断U?U:
你不承诺吗?U:
T
有递归版本吗? 我已经试过了,我得到了循环引用本身的错误

type Unpacked<T> =
    T extends (infer U)[] ? Unpacked<U> :
    T extends (...args: any[]) => infer U ? Unpacked<U> :
    T extends Promise<infer U> ? Unpacked<U> :
    T;
type解包=
T扩展(推断U)[]?未包装:
T扩展(…args:any[])=>推断U?未包装:
你不承诺吗?未包装:
T
由于循环引用,上述代码失败

递归版本将执行以下操作:

Unpacked<Array<Promise<number[]>>> === number;
解包===编号;

当我们不知道需要拆包的深度时,它很有用。

不幸的是,对于您的定义,不允许递归地引用它们自己,除非在特定情况下。根据上述链接拉动请求的描述,引入该功能:

与并集和交集类型类似,不允许条件类型递归地引用自身(但是,允许通过接口类型或对象文本类型进行间接引用,如上面的
DeepReadonly
示例所示)。例如,以下是一个错误:

type ElementType=T扩展任何[]?元素类型:T;//错误

有些时候,人们试图愚弄编译器,让它允许这样的递归类型,但在同样的情况下,有些人编写的东西会使编译器崩溃。这是正式的,所以我不会告诉你怎么做

我也希望看到一个解决方案,但现在还没有(从TS3.0开始)


所以,变通办法。最简单的解决方法是找出可能需要的实际最大深度,然后编写代码。这里有一种方法:

type _U<T> =
  T extends (infer U)[] ? U :
  T extends (...args: any[]) => infer U ? U :
  T extends Promise<infer U> ? U :
  T;

// up to 8 levels deep
type Unpacked<T> = _U<_U<_U<_U<_U<_U<_U<_U<T>>>>>>>>
type\U=
T扩展(推断U)[]?U:
T扩展(…args:any[])=>推断U?U:
你不承诺吗?U:
T
//高达8层深
类型未打包=\U
您可以验证这是否适用于您的示例:

type JustNumber = Unpacked<Array<Promise<number[]>>>; // number
type JustNumber=未打包;//数

它并不完美,但可能是目前你能得到的最好的。希望有帮助。祝你好运

对于只想映射返回值的函数?谢谢。我现在就是这么做的。希望将来能够以合理的堆栈限制支持递归。
type JustNumber = Unpacked<Array<Promise<number[]>>>; // number