gpt4 book ai didi

typescript - Typescript 中 Unpacked 的递归版本?

转载 作者:搜寻专家 更新时间:2023-10-30 21:06:27 25 4
gpt4 key购买 nike

引用 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html 中的 Unpacked .

type Unpacked<T> =
T extends (infer U)[] ? U :
T extends (...args: any[]) => infer U ? U :
T extends Promise<infer 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;

上述代码由于循环引用而失败。

递归版本会这样做:

Unpacked<Array<Promise<number[]>>> === number;

当我们不知道它需要解压到多深时它很有用。

最佳答案

不幸的是你的定义,conditional types不允许递归地引用自己,除非在特定情况下。从上面链接的拉取请求的描述中介绍该功能:

Similar to union and intersection types, conditional types are not permitted to reference themselves recursively (however, indirect references through interface types or object literal types are allowed, as illustrated by the DeepReadonly<T> example above). For example the following is an error:

type ElementType<T> = T extends any[] ? ElementType<T[number]> : T; // Error

曾经有人们设法愚弄编译器允许像这样的递归类型的时候,但在那些情况下,有人可以编写使编译器崩溃的东西。正式a bad idea所以我不会试图告诉你如何那样做。

我也很想看到这个问题的解决方案,但现在还没有(无论如何从 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 JustNumber = Unpacked<Array<Promise<number[]>>>; // number

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

关于typescript - Typescript 中 Unpacked<T> 的递归版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51480502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com