【问题标题】:D3.js v5 Domain() not taking variable for arrayD3.js v5 Domain() 不为数组获取变量
【发布时间】:2018-09-14 15:39:33
【问题描述】:

在我使用 D3 v5 的 Angular 5 项目中,如果我给出以下内容,代码将编译:

let y0 = d3.scaleLinear().domain([0, 100000]).range([this.height, 0]);

但是,如果我为域的上限和下限提供以下变量名,则会收到错误:

let y0 = d3.scaleLinear().domain([d3.min(data.totalCount), d3.max(data.totalCount)]).range([this.height, 0]);

错误:TS2345:“string[]”类型的参数不可分配给“number |”类型的参数或 ({valueOf(): number;})[]'。类型 'string' 不可分配给类型 'number |或 {valueOf(): number;}。

我知道 d3.min 和 d3.max 的参数是数字,如果我提供一个数字测试数组 test = [1, 2, 3, 4],我会得到同样的错误。

为什么它试图将这些变量读取为字符串?我做错了什么?

【问题讨论】:

    标签: javascript angular typescript d3.js


    【解决方案1】:

    d3.min()实际上有四个type definitions

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

    编译器将选择最适合您的代码,鉴于您没有提供任何类型参数,它归结为第一个类型定义。如您所见,这需要一个ArrayLike&lt;string&gt; 参数并返回一个stringundefined。这会产生您观察到的错误。 d3.max() 显然也是如此。

    由于您知道您的 data.totalCount 都是数字,因此您可以轻松地将其作为泛型函数的类型参数传递:

    let y0 = d3.scaleLinear().domain([
      d3.min<number>(data.totalCount), 
      d3.max<number>(data.totalCount)
    ]).range([this.height, 0]);
    

    与您的问题没有直接关系的旁注:您可以使用d3.extent(),它将d3.min()d3.max() 组合在一个调用中。

    let y0 = d3.scaleLinear()
      .domain(d3.extent<number>(data.totalCount))
      .range([this.height, 0]);
    

    【讨论】:

    • 这通常意味着如果你必须明确地传递一个类型参数,你就做错了。如果是这种情况,则声明的顺序可能不正确。
    • 那行得通。非常感谢!我的主管想要使用 v5 的转换,导致缺乏足够的知识库来正确使用,而且官方文档还不容易被图书馆的新手使用。
    • 在 d3.max() 中指定 解决了其中一个问题。
    猜你喜欢
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 2018-11-30
    相关资源
    最近更新 更多