javascript-使用D3.js进行Typescript类型转换

前端之家收集整理的这篇文章主要介绍了javascript-使用D3.js进行Typescript类型转换 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我使用的示例D3图显示here.我在这里声明了以下数据对象:

interface ID3Data {
  age: string,population: number
}

const data: ID3Data[] = [
  { age: "<5",population: 2704659 },{ age: "5-13",population: 4499890 }
]

然后被以下对象消耗:

const pie = d3.pie()
              .value(function(d: any) { return d.population; });

const arc = g.selectAll(".arc")
             .data(pie(data)) // ->>> Specifically this part of the code

产生此错误

TypeScript error: Argument of type 'ID3Data[]' is not assignable to parameter of type '(number | { valueOf(): number; })[]'.
  Type 'ID3Data' is not assignable to type 'number | { valueOf(): number; }'.
    Type 'ID3Data' is not assignable to type '{ valueOf(): number; }'.
      Types of property 'valueOf' are incompatible.
        Type '() => Object' is not assignable to type '() => number'.
          Type 'Object' is not assignable to type 'number'.  TS2345

既然d3.pie().value()显然消耗了非常特定类型的输入数据,那么我在做什么出错了,这会收到编译错误?由于D3的value函数特定于它的库…我可以在打字稿代码中覆盖它吗?

最佳答案
这是有问题的代码

const pie = d3.pie()
              .value(function(d: any) { return d.population; });

由于未指定要传递给生成器的数据类型,因此TypeScript编译器将使用以下type definition

export function pie(): Pie<any,number | { valueOf(): number }>;

由于您的ID3Data类型显然与number |不匹配,因此导致您看到的错误. {valueOf():number}.

幸运的是,在创建生成器时,可以使用泛型传递正确的数据类型来轻松解决此问题:

const pie = d3.pie<ID3Data>()
  .value(function(d) { return d.population; });   // Do not use any for the parameter!

这将使编译器改为使用以下type definition

export function pie<Datum>(): Pie<any,Datum>;

如您所见,类型基准现在传递给Pie interface类型.

原文链接:https://www.f2er.com/js/531257.html

猜你在找的JavaScript相关文章