Typescript期望从d3.nest()中的辅助函数返回undefined.汇总()

tdr*_*ing 5 d3.js typescript typescript-typings

我目前正在D3(v4.4.0)和Typsecript中构建一个可视化,其中包含从@ types/d3安装的类型.对于可视化,我需要嵌套我的数据.我正在尝试使用此代码段,它应该计算每个键的条目数:

d3.nest()
  .key(function(d: any) {return d.key;})
  .rollup(function(leaves: any){
    return d3.sum(leaves, function (d) {
      return 1;
    })
  })
  .entries(this.data);
Run Code Online (Sandbox Code Playgroud)

对于汇总方法中的辅助函数,我得到一个类型错误:

severity: 'Error'
message: 'Argument of type '(leaves: any) => number' is not assignable to parameter of type '(values: {}[]) => undefined'.
Type 'number' is not assignable to type 'undefined'.'
at: '46,15'
source: 'ts'
Run Code Online (Sandbox Code Playgroud)

所以看来tsc期望rollup()返回undefined,这对我来说没有意义,而且这段代码在纯javascript中运行良好.只是在没有汇总()的情况下嵌套数据也可以.

有谁知道这里可能出了什么问题?

谢谢,托马斯

tom*_*zek 6

在D3 v4中,d3.nest()工厂有几个签名 .它们之间的唯一区别是,对于控制约束返回的Nest<Datum, RollupType>生成器的数据类型的两个泛型,您可以控制多少.

由于完成JSDoc对d3-collection的评论仍然是一个跟踪的待办事项,我将在此期间提供一个简短的解释.

Nest<Datum, RollupType>接口中第一个泛型,Datum指的是传递给生成器的以下方法的数据中元素的数据类型:arrayNest

  • map(...)
  • object(...)
  • entries(...)

出于同样的原因,它是key访问器函数的参数的数据类型,并且在您的情况下,array作为参数传递到汇总函数的元素的数据类型.

因此,Datum在调用d3.nest()工厂时明确设置(见下文)总是谨慎的.

第二个通用约束Nest生成器,RollupType只有在打算配置/使用rollup(...)访问器时才是相关的,就像你的情况一样.它控制卷起功能的返回类型.

因此,正如您所说,由于您需要汇总功能,您应该使用以下内容,根据您的源数据类型进行嵌套:

interface YourDatum {
  key: string;
  // any proprties related to the value of this element
}

let data: YourDatum[];

data = [/* set your data */]

d3.nest<YourDatum, number>()
  .key(function (d) { return d.key; })
  .rollup(function (leaves) {
    return d3.sum(leaves, function (d) {
      return 1;
    })
  })
  .entries(data);
Run Code Online (Sandbox Code Playgroud)

}

请注意,访问器函数传入keyrollup受接口定义和泛型的指定类型的约束.

如果您在简单调用时不使用泛型d3.nest(),则默认值将表示您返回a Nest<{}, undefined>.这会强制您将经历的错误略微推动,以确保嵌套下的数据类型对应于方法和访问器函数中的参数/返回类型.

话虽这么说,有涉及到一个较长的注释收益类型的map(...),object(...)并且entries(...)在定义文件的方法.它揭示了嵌套过程的复杂性,如果使用了卷起,它就是ip.你可以在这里找到它.

在工厂中使用泛型,现在在D3 v4定义中相当广泛.

作为最后的评论,我也DefinitelyTyped跟踪的问题,以验证D3收集strictNullChecks.当我有一个安静的时刻时,将与JSDoc评论共同做到这一点......

希望这有助于解释.