首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >递归泛型条件类型定义导致错误(TypeScript)

递归泛型条件类型定义导致错误(TypeScript)
EN

Stack Overflow用户
提问于 2020-06-28 11:34:51
回答 2查看 120关注 0票数 0

请考虑以下几点:

export type UwrapNested<T> = T extends Iterable<infer X> ? UwrapNested<X> : T

我得到了类型错误(使用TypeScript 3.9.4):类型'UwrapNested‘不是泛型的

这是由于类型系统的某些限制吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-28 18:02:25

是的,条件类型不能以这种方式直接递归。见微软/打字稿#26980。人们用了很多技巧来规避这个问题。我推荐的唯一一种方法是将您的类型循环展开为一系列几乎相同的类型,这些类型在某个固定的深度处跳出,如下所示:

代码语言:javascript
运行
复制
type UnwrapNested<T> = T extends Iterable<infer X> ? UN0<X> : T;
type UN0<T> = T extends Iterable<infer X> ? UN1<X> : T;
type UN1<T> = T extends Iterable<infer X> ? UN2<X> : T;
type UN2<T> = T extends Iterable<infer X> ? UN3<X> : T;
type UN3<T> = T extends Iterable<infer X> ? UN4<X> : T;
// ...
type UN4<T> = T extends Iterable<infer X> ? UNX<X> : T;
type UNX<T> = T; // bail out

您根据编译器的性能和预期的用例选择“退出”深度。是的,它很丑,但很简单,而且是“合法的”:

代码语言:javascript
运行
复制
type UOkay = UnwrapNested<string[][][][]> // string
type UTooMuch = UnwrapNested<string[][][][][][][][]> // string[][]

还有其他一些技巧提到,使用分布条件类型延迟评估,并欺骗编译器认为类型不是递归的,但这些是脆弱的,有非常奇怪的副作用,不一定支持。例如

代码语言:javascript
运行
复制
type UnwrapNestedIllegal<T> = {
    base: T, recurse: UnwrapNestedIllegal<T extends Iterable<infer X> ? X : never>
}[T extends Iterable<any> ? "recurse" : "base"]

在尝试使用它之前,这看上去是不太可能的,然后得到一个循环错误:

代码语言:javascript
运行
复制
type Oops = UnwrapNestedIllegal<string> // any

有什么方法可以改变UnwrapNestedIllegal来解决这个问题吗?可能吧。是个好主意吗?我说“不”,虽然我可能有对这一问题的极端看法。事实上,我绝对希望有一种官方支持的方法来获得递归条件类型,但是如果没有语言设计人员的强烈承诺,我就不能凭良心推荐任何人使用这些技巧。

好吧,希望这能帮上忙,祝你好运!

操场链接到代码

票数 1
EN

Stack Overflow用户

发布于 2020-06-28 19:18:41

正如@jcalz所证实的,我就是这样解决这个问题的:

代码语言:javascript
运行
复制
type UnwrapIterable1<T> = T extends Iterable<infer X> ? X : T
type UnwrapIterable2<T> = T extends Iterable<infer X> ? UnwrapIterable1<X> : T
type UnwrapIterable3<T> = T extends Iterable<infer X> ? UnwrapIterable2<X> : T
export type UnwrapNestedIterable<T> = T extends Iterable<infer X> ? UnwrapIterable3<X> : T
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62621963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档