Typescript-如何导入与名称空间同名的声明函数

时间:2019-06-07 13:48:17

标签: typescript typescript-typings typescript2.0

我正在使用城市景观及其打字稿定义。类型的定义如下:

export = cytoscape;
export as namespace cytoscape;

declare function cytoscape(options?: cytoscape.CytoscapeOptions): cytoscape.Core;
declare function cytoscape(extensionName: string, foo: string, bar: any): cytoscape.Core;

declare namespace cytoscape { ... }

我正在这样使用它:

import * as cytoscapeTypes from "cytoscape";
let cytoscape: any = require("cytoscape"); // <- What should *any* be changed to?

这很好:

export type CytoscapeProps = { elements: cytoscapeTypes.ElementDefinition[] }

我不知道如何指定cytoscape方法本身的导入类型。我尝试了各种东西,但似乎无法使其正常工作。我该怎么办?

这可以绘制图形,但是类型不正确,因为我将any用于导入:

  this.cytoscapeInstance = cytoscape(
  {
    container: this.cyRef,
    elements: this.props.elements,
  }
)

1 个答案:

答案 0 :(得分:1)

分别输入importrequire的类型和模块是不必要的。在TypeScript中,当您使用import时,它将导入给定的模块相关的类型。在这种情况下,满足以下条件即可:

import cytoscape from "cytoscape";

现在,当您执行此操作时:

export type CytoscapeProps = { elements: cytoscape.ElementDefinition[] };

... TypeScript非常聪明,可以知道cytoscape.ElementDefinition是一种类型,因为您正在将其用作类型。

执行此操作时:

this.cytoscapeInstance = cytoscape({
  container: this.cyRef,
  elements: this.props.elements,
});

... TypeScript知道cytoscape是模块的主要输出,它是一个函数。

看看此CodeSandbox可以看到它的实际效果:https://codesandbox.io/s/naughty-bouman-kg9e5