自引用泛型构建无环递归数据结构
探索使用自约束泛型(self-referential generics)创建编译期可验证的树形结构,避免运行时循环引用错误。 · 难度:入门 · +10XP
自引用泛型构建无环递归数据结构
常规递归类型(如链表)可能产生循环依赖导致栈溢出。本教程利用自引用泛型约束(Self-referential generic constraint),将结构深度编码在类型参数中,编译器在类型检查阶段就杜绝循环引用。通过实现一个深度受限的N叉树,每个节点携带子节点类型签名,确保所有引用指向已定义节点,从而构建安全的有向无环图。
// 自引用泛型树节点
type TreeNode> = {
key: Known;
children: {
[C in keyof Children]: Children[C] extends TreeNode
? Children[C]
: never;
};
};
// 编译期验证:子节点必须引用已存在的节点类型
const tree: TreeNode<'root', { child1: TreeNode<'child1', {}> }> = {
key: 'root',
children: { child1: { key: 'child1', children: {} } }
};