javascript - 覆盖 d3 TypeScript 定义文件

标签 javascript typescript d3.js typescript-typings

我有以下变量声明

const xScale = d3
      .scaleLinear()
      .range([0, width - margin])
      .domain(
        d3.extent(wave, function(d) {
          return d[0];
        })
      );

wave 接收一个由数字组成的数组,例如

code sample

如果我将 d 参数键入为

//
        d3.extent(wave, function(d:number[][]) {
          return d[0];
        })
//

它会返回这个错误

TS2769: No overload matches this call.   Overload 1 of 4, '(array: ArrayLike, accessor: (datum: number[][], index: number, array: ArrayLike) => string | null | undefined): [string, string] | [undefined, undefined]', gave the following error.     Argument of type '(d: number[][]) => number[]' is not assignable to parameter of type '(datum: number[][], index: number, array: ArrayLike) => string | null | undefined'.       Type 'number[]' is not assignable to type 'string'.   Overload 2 of 4, '(array: ArrayLike, accessor: (datum: number[][], index: number, array: ArrayLike) => Numeric | null | undefined): [undefined, undefined] | [Numeric, Numeric]', gave the following error.     Argument of type '(d: number[][]) => number[]' is not assignable to parameter of type '(datum: number[][], index: number, array: ArrayLike) => Numeric | null | undefined'.       Type 'number[]' is not assignable to type 'Numeric'.         Types of property 'valueOf' are incompatible.           Type '() => Object' is not assignable to type '() => number'.             Type 'Object' is not assignable to type 'number'.

如果我不输入例如

//
        d3.extent(wave, function(d:number[][]) {
          return d[0];
        })
//

我会得到这个错误

TS2345: Argument of type '[string, string] | [undefined, undefined]' is not assignable to parameter of type '(number | { valueOf(): number; })[]'.   Type '[string, string]' is not assignable to type '(number | { valueOf(): number; })[]'.     Type 'string' is not assignable to type 'number | { valueOf(): number; }'.

查看 d3 定义文件,它期望一些不同的东西,我没有提供,但它对我有用:

export function extent(array: ArrayLike): [string, string] | [undefined, undefined];

关于如何克服这些错误并正确输入的任何提示?非常感谢。

最佳答案

The second parameter of extent is an "accessor" ,这与 array.map 采用的参数相同。 d3 的当前类型过于严格:它们需要 (datum: T, index: number) 作为访问器参数类型,但 index 是可选的。

要使当前代码进行类型检查,请将 function(d) 更改为 function(d, i),即使 i 未使用。

一个更正确的解决方案是 fork 明确类型的存储库,并通过在参数名称的末尾添加 ? 使 index 参数在类型中可选。例如,对于一个重载:

export function extent<T>(array: T[], accessor: (datum: T, index?: number) => number): [number, number];

然后您可以使用分支中的类型并向上游提交补丁,这在 this answer 中有详细说明。 .

关于javascript - 覆盖 d3 TypeScript 定义文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59415391/

相关文章:

javascript - Angular5 响应式(Reactive)表单与 mailcheck.js

javascript - 通过复选框模拟 CTRL 按键

javascript - 对于大数据,node.js 上传与发布 - 哪个是更好的选择?

特定文件中的 TypeScript 严格编译器选项

javascript - 返回一个空洞的 promise

javascript - 如何用索引替换div中的字符串

angular - Angular 项目的 tsconfig.json 中的 outDir 会发生什么变化?

javascript - 如何在不缩放绑定(bind)到时间轴的其他形状的情况下放大/缩小 d3.time.scale

javascript - 如何将 x Axis 移动到 svg 的底部

javascript - 带 Json 的 NVD3 离散条形图