我想为树结构定义一个接口。每个节点可以有零个或多个子节点:export interface TreeNode { children?: Array<TreeNode>;}我已经为s实现了一个遍历函数。TreeNodeexport 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
3 回答

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

qq_笑_17
TA贡献1818条经验 获得超7个赞
我想使用a更适合:generic
[key: string]: any
export type Tree<T> = T & { children?: T[]; }
保留我们想要构建树的类型的必需字段和可选字段:对于此问题,Item 是:。Item
Tree<Item>
{ name: string }
添加回答
举报
0/150
提交
取消