我们有一个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"]
}
我们如何(不能)导入没有<reference path=""/>
的Dojox模块?
在进一步检查道场的类型定义后,我发现我可以在没有<reference path="..."/>
的情况下做到这样......
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;
}
然而,index.d.ts
中的dojox接口将gfx定义为Object
。打字稿然后警告
Property&#39; createSurface&#39;类型&#39; dojox&#39;
上不存在
作为测试,我创建了一个只包含以下依赖项的新项目。
"dependencies": {
"@types/dojo": "1.9.40",
"typescript": "2.9.1"
}
然后我在gfx: Object
内将gfx: dojox.gfx;
更改为index.d.ts
。这似乎解决了这个测试项目的所有问题。
我尝试对原始项目执行相同操作,但TypeScript会警告
node_modules/@types/dojo/index.d.ts(26014,24):错误TS2694:命名空间&#39; dojox&#39;没有导出的成员&#39; gfx&#39;。
我已经验证node_modules/@types/dojo
的内容是相同的,并且两个项目都使用相同的TypeScript版本。 tsconfig.json文件也是一样的。
为什么一个项目会看到导出的成员而另一个项目看不到?