如何创建一个`d.ts`文件来导入一个非模块的外部npm库

时间:2016-09-30 18:33:48

标签: javascript typescript rollupjs

我想使用未编写为模块的npm lib

npm install "js-marker-clusterer" --save

这会安装我想要的JS文件:

./ node_modules / JS-标记聚类器/ SRC / markerclusterer.js

// this is the Class I want to export/import
function MarkerClusterer(map, opt_markers, opt_options) {
  // ...
}

我想在我的TS文件中扩展和使用此类。根据TS文档,我可以声明shorthand ambient module来执行此操作,但我不确定将不同文件放在何处。

  

速记环境模块

     

如果您不想花时间写出声明   使用新模块,您可以使用速记声明开始   快。

     

declarations.d.ts (我在哪里放这个文件?)

/// <reference path="node.d.ts"/>
declare module "hot-new-module";
     

来自速记模块的所有导入都将具有任何类型。

import x, {y} from "hot-new-module";
x(y);

现在我有以下内容,但它不正确:

./ SRC /应用/共享/ MY-标记clusterer.d.ts

/// <reference path="/node_modules/js-marker-clusterer/src/markerclusterer.js" />
// ERROR: typescript says *.js is an unsupported extension

declare module "js-marker-clusterer" {
  export class MarkerClusterer {
    constructor(map: any, opt_markers?: any, opt_options?: any);
    map_: any;
    markers_: any[];
    clusters_: any[];
    ready_: boolean;
    addMarkers(markers: any[], opt_nodraw: boolean) : void;
  }
}

/src/app/shared/my-marker-clusterer.ts

/// <reference path="./my-marker-clusterer.d.ts" />
import { MarkerClusterer } from 'js-marker-clusterer';

declare var google;

export class MyMarkerClusterer extends MarkerClusterer {
  constructor(map: any, opt_markers?: any, opt_options?: any) {
    super(map, opt_markers, opt_options);
  }

  addMarkers(markers, opt_nodraw) {
    super.addMarkers(markers, opt_nodraw)
    this.triggerClustersChanged()
  }
  triggerClustersChanged(){
    google.maps.event.trigger(this.map_, 'clustersChanged', this.clusters_);
  }
}

我使用rollupjs所以es2015模块首选

1 个答案:

答案 0 :(得分:0)

嗯,我会被淹没,我上面发布的代码确实有效。我在下面得到了TS TS6054错误,但它仍然有用。

1 /// <reference path="/node_modules/js-marker-clusterer/src/markerclusterer.js" />
src/app/shared/my-marker-clusterer.d.ts(1,1): error TS6054: File '/node_modules/js-marker-clusterer/src/markerclusterer.js' has unsupported extension. The only supported extensions are '.ts', '.tsx', '.d.ts'.

我必须手动编辑JS文件和export

export function MarkerClusterer(map, opt_markers, opt_options) {
   // ...
}

有没有一种方法可以在不编辑原始JS文件的情况下做同样的事情?