无法使用@ types / d3将类型'Area <x>'分配给类型'String'

时间:2018-06-28 22:23:12

标签: typescript d3.js definitelytyped

我在打字稿类上有一个实例方法...

createArea = d3.area<Point>().x((d) => d.x).y0((d) => d.max).y1((d) => d.y);

这有效,但是它被解释为实例字段,因此我尝试添加类型化的lambda ...

createArea = (points:Point[]):String => d3.area<Point>().x((d) => d.x).y0((d) => d.max).y1((d) => d.y);

这不起作用

  

类型'Area'不能分配给类型'String'。

类型定义(@ types / d3)是否存在问题?

export function area<Datum>(): Area<Datum>;

Area()方法明确地返回一个字符串。

if (buffer) return output = null, buffer + "" || null;

这是我的package.json

  "dependencies": {
    "d3": "^5.5.0",
  },
  "devDependencies": {
    "@types/d3": "^5.0.0",
  },

1 个答案:

答案 0 :(得分:0)

函数d3.area()返回的不是String,而是返回Area的abject,而后者是一个接受数据数组(在您的情况下为Point[])的函数,并且返回String。可以通过以下行进行检查:

const tmp = d3.area()([]); // tmp is of type string | null

因此,如果您确实确实需要字符串而不是Area对象,则您的函数必须看起来像这样(为可读性添加了一些格式):

const createArea = (points:Point[]):String => d3.area<Point>()
                                                .x((d) => d.x)
                                                .y0((d) => d.max)
                                                .y1((d) => d.y)
                                                (points)!;

误解必须基于这样一个事实,即d3-area模块内部不返回名为area的函数,而是返回第一个匿名函数。这是JavaScript中的面向对象方法:类只是一个返回实例的函数(在本例中为您所指的area函数)。