TypeScript和d3域类型

时间:2016-06-17 12:55:53

标签: d3.js typescript

我有一个问题,当我想使用域名时。

所以,我尝试使用我的代码的下一部分

var x = d3.time.scale()
  .domain([new Date('2016-06-10'), new Date('2016-06-25')])
  .rangeRound([0, 1000]);

我收到有关域名错误类型的错误...

  

类型'比例'不能分配给' Scale'。

类型的参数      

财产类型'域名'是不相容的。

     

输入' {():日期[]; (日期:数字[]):比例; (日期:日期[]):比例; }'不能分配给' {():number []; (值:数字[]):比例; }'

     

键入'日期[]'不能指定为' number []'。   输入'日期'不能分配类型'数字'。

但如果我们看看d3打字

domain(): Date[];
domain(dates: number[]): Scale<Range, Output>;
domain(dates: Date[]): Scale<Range, Output>;
域名可以采用日期数组!

如果我们禁用类型,那么一切正常。

我的代码的另一部分也有类似的问题:

var drag = d3.behavior.drag()
  .on('drag', function (d) {
    d3.event.sourceEvent.stopPropagation();
  })
  .on('dragstart', function () {
    //
  });

我收到有关错误的信息:

  

Property&#39; sourceEvent&#39;类型&#39;事件|中不存在BaseEvent&#39;

但如果我们查看类型

export var event: Event | BaseEvent;

interface BaseEvent {
     type: string;
     sourceEvent?: Event;
 }

我使用打字:

  

&#34; d3&#34;:&#34;注册管理机构:dt / d3#0.0.0 + 20160614091820&#34;

和webpack的awesome-typescript-loader

那么,我的错误是什么?

2 个答案:

答案 0 :(得分:1)

您是否打算使用D3 v4或D3 v3?

您发布的代码段似乎暗示D3 v3。与杰克所说的一致。

当前使用的是R4版本4定义,假设您使用的是TypeScript 2。

他引用的repo已经完全迁移到DefintitelyTyped(目前类型为2.0分支),我们主要使用它进行协作开发,而生态系统仍在不断变化......

现在通过模块获取定义只需使用 npm install @types/d3-selection --save(如果您不发布供第三方使用,则为--save-dev)

截至昨天,npm install @types/d3 --save还将为您提供与标准D3套装相对应的定义。

在发布过程中,从DefinitelyTyped到npm @types存在一些技术债务,因为我们不想破坏仍需要传统D3 v3.5定义的库。现在已经解决了。

安装相关定义后,只需对相应的D3模块(或d3标准软件包)使用TypeScript / ES6 import语句。

import { select, Selection } from 'd3-selection';
import * as d3Drag from 'd3-drag';

或类似的。您还可以创建自己的TypeScript模块作为模块的子集进行捆绑,如果它更方便您查看我对https://stackoverflow.com/questions/40314024/typescript-d3-v4-import-not-working

的回答

如果您想在带有全局

的香草剧本中使用这些定义,情况就会略有不同

如果那是你的使用案例,请告诉我,我可以添加更多信息。

答案 1 :(得分:0)

我昨天使用Typescript 2.0和最新的@types/d3-drag发生了这种情况。

我认为这只是打字的问题,请点击此处查看更新:https://github.com/tomwanzek/d3-v4-definitelytyped/issues

我的乐队创可贴:

let drag:any = d3.behavior.drag()...