angular - d3v4 + Typescript + angular2 fel vid användning av d3.line().x((d) => {funktion})
Så jag har det här...
import { D3Service, D3, Selection } from 'd3-ng2-service';
interface ChartData {
q: number,
p: number
}
export class GraphComponent implements OnInit{
private d3;
private x1;
private y;
constructor(element: ElementRef, d3Service: D3Service) {
this.d3 = d3Service.getD3();
let d3 = this.d3;
this.y = d3.scaleLinear()
.domain([0,100])
.range([330, 20])
;
this.x1 = d3.scaleLinear()
.range([0, 100])
;
}
render() {
let y = this.y;
let x1 = this.x1;
let data = [{p:1,q:1}, {p:0.5,q:2}]
var line = d3.line()
.x((d: ChartData) => {return x1(d.q);})
.y((d: ChartData) => {return y(d.p);});
svg.append("path")
.data(data)
.attr("class", "line")
.attr("d", line);
}
}
Jag får ett fel på raden .x(d: ChartData) som säger:
Argument av typen '(d: ChartData) => any' kan inte tilldelas parametern av typen '(d: [number, number], index: number, data: [number, number][]) => number'. Typerna av parametrarna 'd' och 'd' är inkompatibla. Typen '[number, number]' kan inte tilldelas typen 'ChartData'. Egenskapen 'q' saknas i typen '[number, number]'.
Vilket jag sedan tittar på dokumentationen för d3, som säger att jag behöver injicera mina data i line() via line(data) för att ha egna data.
var line = d3.line(data)
.x((d: ChartData) => {return x1(d.q);})
.y((d: ChartData) => {return y(d.p);});
Vilket sedan resulterar i detta fel...
FEL i [default] file.ts:259:13 De angivna parametrarna matchar ingen signatur av anropsmålet.
...trots att d3-dokumentationen säger att jag borde kunna göra det. Så vad gör jag fel?
Svar #1
Din första syntax (utan att skicka data) är korrekt. Jag tror att du bara behöver tala om för TypeScript vad du skickar till d3.line som:
var line = d3.line<ChartData>()
.x((d: ChartData) => {return x1(d.q);})
.y((d: ChartData) => {return y(d.p);});
Det försöker kompilera med standardinställningen som är:
d3.line<[number, number]>
