我们有一个 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: Object
为gfx: 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 文件也是一样的。
为什么一个项目会看到导出的成员而另一个没有?