[英]Typescript interface for tree structure
我想為樹結構定義一個接口。
每個節點可以有零個或多個子節點:
export interface TreeNode {
children?: Array<TreeNode>;
}
我已經為TreeNode
實現了遍歷 function 。
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
。
我不想向接口TreeNode
添加屬性name
,因為樹節點可以具有動態屬性。 如何修改TreeNode
接口以接受更通用的類型?
您可能遇到的錯誤是:
Object 文字只能指定已知屬性,並且類型中不存在“名稱”
如果你想允許其他鍵,它必須是類型的一部分。 您可以使用索引簽名執行此操作:
export interface TreeNode {
[key: string]: any // type for unknown keys.
children?: TreeNode[] // type for a known property.
}
嘗試將此聯合類型與object
一起使用:
type TreeNode = {
children?: Array<TreeNode>;
} & object;
我猜想使用generic
而不是[key: string]: any
更適合:
export type Tree<T> = T & {
children?: T[];
}
保留我們要構建樹的Item
類型的必填和可選字段: Tree<Item>
對於這個問題,Item 是: { name: string }
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.