Typescript - как импортировать объявленную функцию с тем же именем, что и пространство имен - PullRequest
1 голос
/ 07 июня 2019

Я использую городской пейзаж и определения его машинописи.Типы определены так:

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 Ответ

1 голос
/ 07 июня 2019

Импорт наборов и модуля отдельно с import и require, соответственно, не требуется. В 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

...