2

我们有一个 TypeScript 项目,我们需要在其中使用 Dojo 的createSurface. 但是,我们意外地需要包含<reference path="..."/>如下所示。

/// <reference path="node_modules/@types/dojo/dojox.gfx.d.ts"/>
import gfx1 = require("dojox/gfx");
import gfx2 from "dojox/gfx";
import * as gfx3 from "dojox/gfx";
import { createSurface } from "dojox/gfx";

const el = new HTMLElement();

gfx1.createSurface(el, 100, 100); // require
gfx2.createSurface(el, 100, 100); // from
gfx3.createSurface(el, 100, 100); // star
createSurface(el, 100, 100);      // single method

我本来希望不需要<reference path="..."/>但没有它 TypeScript 抱怨它找不到显示的每个 require/import 语句的模块。

我们的 package.json 是

{
  "name": "react-dojo",
  "version": "1.0.0",
  "main": "index.ts",
  "scripts": {
    "build": "tsc"
  },
  "license": "MIT",
  "devDependencies": {},
  "dependencies": {
    "@types/dojo": "1.9.40",
    "@types/react": "^16.3.17",
    "@types/react-dom": "^16.0.6",
    "dojo": "^1.13.0",
    "react": "^16.4.0",
    "react-dom": "^16.4.0",
    "typescript": "2.9.1"
  }
}

我们的 tsconfig.json 是

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "jsx": "react",
    "strict": true,
    "esModuleInterop": true
  },
  "exclude": ["dist", "node_modules"]
}

我们如何(可以)在没有 的情况下导入 Dojox 模块<reference path=""/>

2018 年 6 月 4 日更新

在进一步检查 dojo 的类型定义后,我发现我可以在没有<reference path="..."/>类似的情况下进行 dojox ......

import * as dojox from "dojo/main.dojox";
dojox.gfx.createSurface(el, 100, 100);

// or

import { gfx } from "dojo/main.dojox";
gfx.createSurface(el, 100, 100);

这是因为@types/dojo/index.d.ts导出了以下模块。

declare module "dojo/main.dojox" {
    var exp: dojo.main.dojox
    export=exp;
}

但是,dojox 接口index.d.ts将 gfx 定义为Object. 打字稿然后警告说

“dojox”类型上不存在属性“createSurface”

作为测试,我创建了一个只有以下依赖项的新项目。

"dependencies": {
  "@types/dojo": "1.9.40",
  "typescript": "2.9.1"
}

然后我更改gfx: Objectgfx: dojox.gfx;inside index.d.ts。这似乎解决了这个测试项目的所有问题。

我试图对我的原始项目做同样的事情,但 TypeScript 警告说

node_modules/@types/dojo/index.d.ts(26014,24):错误 TS2694:命名空间“dojox”没有导出的成员“gfx”。

我已经验证了 的内容node_modules/@types/dojo是相同的,并且两个项目都使用相同的 TypeScript 版本。tsconfig.json 文件也是一样的。

为什么一个项目会看到导出的成员而另一个没有?

4

0 回答 0