You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为树节点增强函数基于泛型定义递归返回类型?

解决方案:用递归类型别名定义返回类型

要搞定这个类型定义里的无限递归问题,我们可以借助递归类型别名来描述增强后的树节点结构——TypeScript 4.1及以上版本支持这种递归类型,刚好匹配函数的递归逻辑。

1. 定义增强后的节点类型

先声明一个递归类型,明确每个节点的最终结构:

type EnrichedTreeNode<T extends { children?: Array<T> }, U> = T & U & {
  // 根节点的parent为undefined,其他节点的parent是增强后的父节点
  parent: EnrichedTreeNode<T, U> | undefined;
  // 统一将children定义为增强后的节点数组(原节点无children则为空数组)
  children: EnrichedTreeNode<T, U>[];
};

2. 修正函数的完整类型定义

基于上面的类型,调整函数的泛型和返回类型:

class TreeUtils {
  static enrichTreeNodes = <T extends { children?: Array<T> }, U = {}>(
    nodes: T[],
    parent?: EnrichedTreeNode<T, U>,
    otherEnrichments: U = {} as U
  ): EnrichedTreeNode<T, U>[] =>
    nodes.map(node => ({
      ...node,
      parent,
      children: node.children
        ? this.enrichTreeNodes(
            node.children,
            {
              ...node,
              parent,
              ...otherEnrichments
            } as EnrichedTreeNode<T, U>,
            otherEnrichments
          )
        : [],
      ...otherEnrichments
    }));
}

关键说明

  • 递归类型别名EnrichedTreeNode会自动处理嵌套的parent和children类型,不会触发无限递归——TypeScript能识别这是合法的递归引用并正确解析。
  • 给泛型U设置默认值{},避免调用时必须传入otherEnrichments参数。
  • 传递给子节点的parent被断言为EnrichedTreeNode<T, U>,因为此时当前节点已经完成增强,完全符合该类型定义。

内容的提问来源于stack exchange,提问作者bturner1273

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 06:15:20