Я хочу определить интерфейс для древовидной структуры.
Каждый узел может иметь ноль или более дочерних узлов:
export interface TreeNode {
children?: Array<TreeNode>;
}
Я реализовал функцию обхода для TreeNode
s.
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);
Однако компиляция не выполняется, потому что аргумент типа treeData
не может быть применен к traverseTree
.
Я не хочу добавлять атрибут name
к интерфейсу TreeNode
, потому что узел дерева может иметь динамические c свойства. Как я могу изменить интерфейс TreeNode
, чтобы он принимал более общие типы?