猿问

树结构的打字接口

我想为树结构定义一个接口。


每个节点可以有零个或多个子节点:


export interface TreeNode {

  children?: Array<TreeNode>;

}

我已经为s实现了一个遍历函数。TreeNode


export function traverseTree(treeData: Array<TreeNode> | TreeNode, callback: (treeNode: any) => any) {

  // implementation omitted

}

我想测试它。代码如下:


const treeData = [

  {

    name: "root_1",

    children: [

      {

        name: "child_1",

        children: [

          {

            name: "grandchild_1"

          },

          {

            name: "grandchild_2"

          }

        ]

      }

    ]

  },

  {

    name: "root_2",

    children: []

  }

];

const traversingHistory = [];

const callback = (treeNode: any) => {

  traversingHistory.push(treeNode.name);

}

traverseTree(treeData, callback);

但是,编译失败,因为 类型的参数不能应用于 。treeDatatraverseTree


我不想向接口添加属性,因为树节点可以具有动态属性。如何修改接口以接受更通用的类型?nameTreeNodeTreeNode


幕布斯6054654
浏览 139回答 3
3回答

慕斯709654

您可能遇到的错误是:对象文本可能仅指定已知属性,并且“name”在类型中不存在如果要允许其他键,则必须是该类型的一部分。您可以使用索引签名执行此操作:export interface TreeNode {&nbsp; [key: string]: any // type for unknown keys.&nbsp; children?: TreeNode[] // type for a known property.}

qq_笑_17

我想使用a更适合:generic[key: string]: anyexport&nbsp;type&nbsp;Tree<T>&nbsp;=&nbsp;T&nbsp;&&nbsp;{ &nbsp;&nbsp;children?:&nbsp;T[]; }保留我们想要构建树的类型的必需字段和可选字段:对于此问题,Item 是:。ItemTree<Item>{ name: string }

饮歌长啸

尝试将此联合类型与 :objecttype&nbsp;TreeNode&nbsp;=&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;children?:&nbsp;Array<TreeNode>; }&nbsp;&&nbsp;object;
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答