我有一个外部JavaScript库,可以在窗口中创建一个全局对象。 要在打字稿代码中使用此对象,我创建了一个环境模块文件(d.ts),该文件在其他打字稿文件中导入。
我面临的问题是编译器说模块文件不是模块
src/App.ts(6,22): error TS2306: File '/Users/user/ts-problems/src/abc.d.ts' is not a module.
我也使用带有ts-loader的webpack,但用(tsc)单独编译它会给我相同的结果。
这是abc.d.ts环境模块文件
declare module "abc" {
export interface Greeter {
sayHello(): void;
}
export var abc: Greeter;
}
这是App.ts文件:
import * as abc from "./abc";
class App {
static sayGoodbye() {
console.log("goodbye from App.ts");
}
}
abc.abc.sayHello();
App.sayGoodbye();
测试项目位于https://github.com/daneilsan/ts-module-problem
任何帮助都会非常感激,因为我不知道还能做什么
答案 0 :(得分:1)
文件abc.d.ts
在顶层没有任何export
或imprort
语句,因此它不是模块,不能与相对导入一起使用。也就是说,
import ...some stuff... from "./abc";
失败。
但是,files
中没有include
,exclude
或tsconfig.json
,因此默认情况下,*.ts
或{{1}的文件扩展包含在编译中。
这意味着包含*.d.ts
,因此不需要abc.d.ts
,并且编译器可以看到其中的所有声明,特别是这一个:
///reference
这意味着您可以使用此导入
declare module "abc" {
... stuff exported here
}
获取导入的内容。它将以import * as abc from "abc";
和abc.Greeter
提供。
此表格
abc.abc
也有效,可以直接使用import {Greeter, abc} from "abc";
和Greeter
,而不是abc
范围的属性。
简而言之:要使事情正常工作,abc
语句中的模块名称必须与import
语句(declare module
)中的模块名称完全拼写,并且文件必须与包含"abc"
必须包含在汇编中(默认情况下已经使用declare module
完成)。