如何为树节点增强函数基于泛型定义递归返回类型?
解决方案:用递归类型别名定义返回类型
要搞定这个类型定义里的无限递归问题,我们可以借助递归类型别名来描述增强后的树节点结构——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
相关产品推荐
相关产品推荐

