如何解决遍历TypeScript类型级链接列表,而不会出现深度错误
**这是一个与TypeScript ^ 4.1有关的问题**
interface ListNode {
value: string;
next: ListNode | undefined;
}
这是类型级实例的示例。
type RootNode = {
value: "a";
next: {
value: "b";
next: {
value: "c";
next: undefined;
};
};
};
我想将此窄链表类型简化为以下类型。
type Flattened = [
{value: "a"},{value: "b"},{value: "c"},]
我一直遇到TS错误2589(深度过多/可能无限大)。
到目前为止,这是我采用的两种方法。
- 递归元组传播。
type Flatten<T extends ListNode> = [
Omit<T,"next">,...(T["next"] extends ListNode
? Flatten<T["next"]>
: [])
]
- 模拟具有映射类型的元组。
type Flatten<
T extends ListNode,I extends undefined[] = []
> =
T["next"] extends ListNode
? Record<I["length"],Omit<T,"next">> & Flatten<T["next"],[...I,undefined]>
: Record<I["length"],"next">>;
我什至尝试对增量进行硬编码。
type Increment = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
type Flatten<
T extends ListNode,I extends number = 0
> =
T["next"] extends ListNode
? Record<I,Increment[I]>
: Record<I,"next">>;
仍然,我收到错误2589。
如果有人设计了解决方法,我将不胜感激。
谢谢。
解决方法
结果表明,仅当输入链接列表类型是从其他递归类型派生时,才发生此错误。上述扁平化方法可以按预期工作。
interface ListNode {
value: string;
next: ListNode | undefined;
}
type RootNode = {
value: "a";
next: {
value: "b";
next: {
value: "c";
next: undefined;
};
};
};
type Flatten<T extends ListNode> = [
Omit<T,"next">,...(T["next"] extends ListNode
? Flatten<T["next"]>
: [])
]
type Result = Flatten<RootNode>; // [{value: "a"},{value: "b"},{value: "c"}]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。