2

我有一个在窗口中创建全局对象的外部 javascript 库。为了在打字稿代码中使用这个对象,我创建了一个环境模块文件(d.ts),它被导入到其他打字稿文件中。

我面临的问题是编译器说模块文件不是模块

src/App.ts(6,22): error TS2306: File '/Users/user/ts-problems/src/abc.d.ts' is not a module.

我也将 webpack 与 ts-loader 一起使用,但使用 (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获得

任何帮助将不胜感激,因为我不知道还能做什么

4

1 回答 1

1

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

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

失败。

但是,您的 中没有或不存在files,因此默认情况下,任何带有或扩展名的文件都包含在编译中。includeexcludetsconfig.json*.ts*.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";

也可以直接工作,制作Greeterabc可用,而不是作为abc范围的属性。

简而言之:为了让事情正常工作,语句中的模块名称必须与语句 ( )import中的拼写方式完全相同,并且包含的​​文件必须包含在编译中(默认情况下已经使用 your 完成了)。declare module"abc"declare moduletscontig

于 2017-06-12T05:45:37.430 回答