typescript - Angular-4 d3 v4 Problem: Egenskapen 'x' finnes ikke på typen 'HierarchyNode'


Jeg prøver å lage et d3-tre i min Angular-app, jeg prøver dette eksempelet: https://bl.ocks.org/d3noob/08ecb6ea9bb68ba0d9a7e89f344acec8

Problem oppstår når jeg prøver å få tilgang til nodenes x-y-koordinater, jeg får feilen: Egenskapen 'x' eksisterer ikke på typen 'HierarchyNode'

Når jeg logger dataene, kunne jeg se at x-y-koordinatene er der. Skjermbilde som viser de loggede dataene

  // 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 og d.y gir feilen

Svar #1

TypeScript har kontekstuell typeinference, og siden HierarchyNode ikke eksporterer 'x' og 'y'-egenskaper vil ikke dette kompilere. Du kan bruke 'any' som inputtype for å unngå feilen:

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

Svar #2

Du kan eksplisitt spesifisere typen for å overstyre kontekstuell typisering

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

Relaterte artikler