gpt4 book ai didi

javascript - '[string, string] 类型的参数错误? (在 Angular 和 d3 中)

转载 作者:行者123 更新时间:2023-11-30 08:21:55 26 4
gpt4 key购买 nike

我将 d3(版本 4)与 Angular 5 一起使用,遇到了一些我找不到太多信息的错误。在我的 name.component.ts 中有我的 d3 代码,并且在某些行下出现错误。

var x = d3.scaleTime()
.rangeRound([0, width])
.domain(d3.extent(this.data, function (d) { return d.date; }));

var y = d3.scaleLinear()
.rangeRound([height, 0])
.domain(d3.extent(this.data, function (d) { return d.ratio; }));

对于这两行,我在域内的所有内容下都得到了红线 (d3.extent(this.data, function (d) { return d.ratio; }))。

错误是:

Argument of type '[string, string] | [undefined, undefined]' is not 
assignable to parameter of type '(number | Date | { valueOf(): number;}) []'.
Type '[string, string]' is not assignable to type '(number | Date |
{valueOf(): number; })[]'.
Types of property 'push' are incompatible.
Type '(...items: string[]) => number' is not assignable to type
'(...items: (number | Date | { valueOf(): number; })[]) => number'.
Types of parameters 'items' and 'items' are incompatible.
Type 'number | Date | { valueOf(): number; }' is not assignable
to type 'string'.
Type 'number' is not assignable to type 'string'.

我的猜测是日期类型存在冲突,但无法弄清楚。有什么想法吗?

如果这有帮助,这是我的整个 .ts 文件:

import { Component, OnInit, Input } from '@angular/core';
import { DataService } from '../data.service';
import { Http } from '@angular/http';
import * as d3 from 'd3';

@Component({
selector: 'app-name',
templateUrl: './name.component.html',
styleUrls: ['./name.component.css']
})
export class Name implements OnInit {
@Input() site1;

constructor(private _dataService: DataService, private http: Http) { }

date: Date;
dates: any;
value: Number;
eachobj: any;
data: any;
average: any;
values: any;
name: any;
ngOnInit() {

this.data = this.site1
this.dates = Object.keys(this.data.historical_data)
this.values = Object.values(this.data.historical_data)
this.values.forEach((obj, i) => obj.date = this.dates[i]);
this.data = this.values


var svg = d3.selectAll("#watertemp_graph"),
margin = { top: 20, right: 20, bottom: 30, left: 0 },
width = +svg.attr("width") - margin.left - margin.right,
height = +svg.attr("height") - margin.top - margin.bottom
var parse = d3.timeParse("%Y-%m-%d")
var first = this.data[0].date
var last = this.data[(this.data.length) - 1].date

var g = svg.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
var baseValue = +this.data[0].avg_water_temp;
this.data.forEach(function (d) {
d.date = parse(d.date);
d.ratio = +(d.avg_water_temp / baseValue);
});

var x = d3.scaleTime()
.rangeRound([0, width])
.domain(d3.extent(this.data, function (d) { return d.date; }));
//ERROR

var y = d3.scaleLinear()
.rangeRound([height, 0])
.domain(d3.extent(this.data, function (d) { return d.ratio; }));
//ERROR

var line = d3.line()
.x(function (d) { return x(d['date']); })
.y(function (d) { return y(d['ratio']); });


// plot first and last dates on x axis
svg.append('g')
.attr("class", "axis--x")
.append("text")
.attr("fill", "#000")
.attr("x", (width / 2) - 80)
.attr("y", height + 40)
.text(first)
.style("font-size", "09")
.style("font-family", "Roboto")
.style('fill', '#5a5a5a');
svg.append('g')
.attr("class", "axis--x")
.append("text")
.attr("fill", "#000")
.attr("x", (width / 2) + 45)
.attr("y", height + 40)
.text(last)
.style("font-size", "09")
.style("font-family", "Roboto")
.style('fill', '#5a5a5a');


g.append("g")
.call(d3.axisLeft(y))
.remove();

g.append("path")
.datum(this.data)
.attr("fill", "none")
.attr("stroke", "#26aae2")
.attr("stroke-width", 1.5)
.attr("d", line);

}

}

最佳答案

d3.extenttwo overloads that take two parameters :

export function extent<T>(array: ArrayLike<T>,
accessor: (datum: T, index: number, array: ArrayLike<T>) => string | undefined | null):
[string, string] | [undefined, undefined];

export function extent<T, U extends Numeric>(array: ArrayLike<T>,
accessor: (datum: T, index: number, array: ArrayLike<T>) => U | undefined | null):
[U, U] | [undefined, undefined];

TypeScript 总是解析对第一个匹配重载的调用,并且由于 this.data 被声明为 any 类型,TypeScript 无法排除第一个重载匹配.这就是 [string, string] 的来源。如果您为 this.data 指定一个更精确的类型,第一次调用应该解析为第二个重载并且返回类型应该作为预期的 [Date, Date] | [未定义,未定义]。您仍然需要一个类型断言来断言结果是 [Date, Date] 而不是 [undefined, undefined];我不知道有任何合理的方法可以通过缩小来做到这一点。所以你的代码看起来像:

var x = d3.scaleTime()
.rangeRound([0, width])
.domain(<[Date, Date]>d3.extent(this.data, function (d) { return d.date; }));

鉴于您需要类型断言,您可以将 this.data 保留为 any,但一般来说,给它一个适当的类型会更好。类似的评论适用于对 d3.extent 的第二次调用。

关于javascript - '[string, string] 类型的参数错误? (在 Angular 和 d3 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52124689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com