如何在打字稿中创建和导入自制的环境模块?

时间:2017-06-10 17:30:37

标签: typescript webpack ts-loader

我有一个外部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

任何帮助都会非常感激,因为我不知道还能做什么

1 个答案:

答案 0 :(得分:1)

文件abc.d.ts在顶层没有任何exportimprort语句,因此它不是模块,不能与相对导入一起使用。也就是说,

import ...some stuff... from "./abc";

失败。

但是,files中没有includeexcludetsconfig.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完成)。