I want to define an interface for tree structure.
Each node can have zero or more children:
export interface TreeNode {
children?: Array<TreeNode>;
}
I have implemented a traversing function for TreeNodes.
export function traverseTree(treeData: Array<TreeNode> | TreeNode, callback: (treeNode: any) => any) {
// implementation omitted
}
I want to test it. Code is as follows:
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);
However, compilation fails because treeData's argument of type cannot be applied to traverseTree.
I don't want to add attribute name to interface TreeNode because a tree node can have dynamic properties. How can I modify TreeNode interface to accept more general types?