微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

遍历TypeScript类型级链接列表,而不会出现深度错误

如何解决遍历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(深度过多/可能无限大)。

到目前为止,这是我采用的两种方法

  1. 递归元组传播。
type Flatten<T extends ListNode> = [
  Omit<T,"next">,...(T["next"] extends ListNode
    ? Flatten<T["next"]>
    : [])
]
  1. 模拟具有映射类型的元组
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 举报,一经查实,本站将立刻删除。