簡體   English   中英

TypeScript和d3域類型

[英]TypeScript and d3 domain type

我有一個問題,當我想使用域名時。

所以,我嘗試使用我的代碼的下一部分

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

我收到有關域的錯誤類型的錯誤...

“Scale”類型的參數不能分配給“Scale”類型的參數。

屬性“域”的類型不兼容。

輸入'{():Date []; (日期:數字[]):比例; (日期:日期[]):比例; }'不能賦值給'{():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 () {
    //
  });

我得到錯誤:

類型'Event |上不存在屬性'sourceEvent' BaseEvent”。

但是如果我們看一下類型

export var event: Event | BaseEvent;

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

我用的是打字:

“d3”:“注冊表:dt / d3#0.0.0 + 20160614091820”

和webpack的awesome-typescript-loader

那么,我怎么了?

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

你發布的代碼片段似乎意味着D3 v3。 與傑克所說的一致。

假設您使用的是TypeScript 2,則可以使用當前的D3版本4定義。

他引用的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-的回答工作的

如果你想在帶有全局的vanilla腳本中使用定義,情況就會略有不同

如果這是你的用例讓我知道,我可以添加更多信息。

我昨天使用Typescript 2.0和最新的@types/d3-drag發生了這種情況。

我認為這只是一個問題,請點擊此處查看更新: https//github.com/tomwanzek/d3-v4-definitelytyped/issues

我的創可貼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM