树结构的打字稿接口

gli*_*a93 3 javascript tree interface typescript

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

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

export interface TreeNode {
  children?: Array<TreeNode>;
}
Run Code Online (Sandbox Code Playgroud)

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

export function traverseTree(treeData: Array<TreeNode> | TreeNode, callback: (treeNode: any) => any) {
  // implementation omitted
}
Run Code Online (Sandbox Code Playgroud)

我想测试一下。代码如下:

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);
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_*ira 12

我想使用 ageneric代替[key: string]: any更合适:

export type Tree<T> = T & {
  children?: T[];
}
Run Code Online (Sandbox Code Playgroud)

Item保留我们想要构建树的类型的必填和可选字段:Tree<Item> 对于这个问题,项目是:{ name: string }


Ale*_*yne 5

您可能遇到的错误是:

对象字面量只能指定已知属性,类型中不存在“名称”

如果你想允许其他键,它必须是类型的一部分。您可以使用索引签名执行此操作:

export interface TreeNode {
  [key: string]: any // type for unknown keys.
  children?: TreeNode[] // type for a known property.
}
Run Code Online (Sandbox Code Playgroud)