【问题标题】:Overriding d3 TypeScript definition file覆盖 d3 TypeScript 定义文件
【发布时间】:2023-03-21 19:48:01
【问题描述】:

我有以下变量声明

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

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

如果我将d 参数键入为

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

它会返回这个错误

TS2769:没有与此调用匹配的重载。重载 1 of 4, '(array: ArrayLike, accessor: (datum: number[][], index: number, array: ArrayLike) => string | null | undefined): [string, string] | [未定义,未定义]',给出了以下错误。 '(d: number[][]) => number[]' 类型的参数不可分配给 '(datum: number[][], index: number, array: ArrayLike) => string |空 |不明确的'。类型 'number[]' 不可分配给类型 'string'。重载 2 of 4, '(array: ArrayLike, accessor: (datum: number[][], index: number, array: ArrayLike) => Numeric | null | undefined): [undefined, undefined] | [Numeric, Numeric]',给出了以下错误。 '(d: number[][]) => number[]' 类型的参数不可分配给 '(datum: number[][], index: number, array: ArrayLike) => Numeric |空 |不明确的'。类型“数字[]”不可分配给类型“数字”。属性“valueOf”的类型不兼容。类型 '() => Object' 不可分配给类型 '() => number'。类型“对象”不可分配给类型“数字”。

如果我不输入诸如

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

我会收到这个错误

TS2345: '[string, string] | 类型的参数[undefined, undefined]' 不能分配给类型为 '(number | { valueOf(): number; })[]' 的参数。类型 '[string, string]' 不能分配给类型 '(number | { valueOf(): number; })[]'。类型 'string' 不可分配给类型 'number | { valueOf(): 数字; }'。

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

导出函数范围(array: ArrayLike): [string, string] | [未定义,未定义];

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

【问题讨论】:

    标签: javascript typescript d3.js typescript-typings


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-04-28
      • 2021-01-03
      • 2018-05-18
      • 2017-05-08
      • 2016-02-12
      • 1970-01-01
      • 2018-07-24
      • 2019-09-29
      • 1970-01-01
      相关资源
      最近更新 更多