d3.js Angular-4 d3 v4问题:类型'HierarchyNode'上不存在属性'x'

pdkcd3nj  于 2022-11-12  发布在  Angular
关注(0)|答案(3)|浏览(177)

我正在尝试在我的Angular 应用程序中创建一个d3树,我正在尝试这个例子:https://bl.ocks.org/d3noob/08ecb6ea9bb68ba0d9a7e89f344acec8
尝试访问节点x-y坐标时存在问题,我得到错误:类型'HierarchyNode'上不存在属性'x'
当我记录数据时,我可以看到x-y坐标在那里。Screenshot showing the logged data

// declares a tree layout and assigns the size
  var treemap = d3.tree()
    .size([this.height, this.width]);

  //  assigns the data to a hierarchy using parent-child relationships
  var nodes = d3.hierarchy(this.treeData, function(d) {
    return d.children;
    });
  // maps the node data to the tree layout
  nodes = treemap(nodes);
console.log(nodes.descendants());
  // adds each node as a group
  var node = g.selectAll(".node")
    .data(nodes.descendants())
    .enter().append("g")
    .attr("class", function(d) { 
      return "node" + 
        (d.children ? " node--internal" : " node--leaf"); })
    .attr("transform", function(d) { 
      return "translate(" + d.x + "," + d.y + ")"; });

d.x和d.y产生误差

ykejflvf

ykejflvf1#

TypeScript具有contextual type inference,并且由于HierarchyNode不导出“x”和“y”属性,因此无法编译。可以使用“any”作为输入类型以避免此错误:

...
.attr("transform", function(d: any) { 
  return "translate(" + d.x + "," + d.y + ")"; });
rdlzhqv9

rdlzhqv92#

您可以显式指定要覆盖上下文类型化的类型

.attr('cx', function (d: HierarchyPointNode<MyDatumInterface>) {
        return d.x // no TS error
    })
7tofc5zh

7tofc5zh3#

我遇到了同样的问题。虽然zokar.com的答案解决了这个问题,但是它破坏了类型检查。问题的起因是在treemap(root)之后,树中的节点被添加了x和y属性。它们应该被类型化为HierarchyPointNode而不是HierarchyNode。但是treemap不能正确地转换类型。你可以使用类型Assert来纠正它:

interface NodeCustom{
        ...
      }
const root = d3.hierarchy<NodeCustom>(YourTreeData as NodeCustom)
...
treemap(root)
const nodes = (root.descendants() as HierarchyPointNode<NodeCustom>[])

相关问题