gli*_*a93 3 javascript tree interface typescript
我想为树结构定义一个接口。
每个节点可以有零个或多个子节点:
export interface TreeNode {
children?: Array<TreeNode>;
}
Run Code Online (Sandbox Code Playgroud)
我已经为TreeNode
s实现了一个遍历函数。
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 }
。
您可能遇到的错误是:
对象字面量只能指定已知属性,类型中不存在“名称”
如果你想允许其他键,它必须是类型的一部分。您可以使用索引签名执行此操作:
export interface TreeNode {
[key: string]: any // type for unknown keys.
children?: TreeNode[] // type for a known property.
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3430 次 |
最近记录: |