使用定义文件的循环依赖项

时间:2014-05-25 15:20:36

标签: typescript circular-dependency

在我的项目中,我使用他们的定义文件(.d.ts)而不是实际文件(.ts)来引用其他文件,因为typescript编译器倾向于在其路径中编译任何.ts文件,甚至当我想要的只是编译一个文件。引用.d.ts文件可以避免这种情况。

现在,假设我有一个大文件并决定将其分成两个单独的文件,但仍然需要每个文件使用另一个文件。加载第一个文件然后加载另一个文件:

one.ts:

/// <reference path="two.d.ts" />
module myModule {
    var data: any;

    export function init(): void {
        // load script two.js
    }

    export function twoLoaded(): void {
        myModule.doSomething(data);
    }
}

two.ts:

/// <reference path="one.d.ts" />
module myModule {
    export function doSomething(data: any): void {
        // ...
    }

    myModule.twoLoaded();
}

当我尝试编译其中一个文件时,我收到Overload signatures must all be ambient or non-ambient错误消息,但在我的阅读项目中,这是一条Duplicate identifier错误消息。

知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

我通常组织这样的方式是你将一个文件指定为&#34;根文件&#34;。所以,让我们说你有一个使用one.ts和two.ts的main.ts.引用只需要包含在main.ts中,而不是其他文件中。在IntelliJ(我使用的)中,您将文件观察器标记为&#34;仅编译主文件&#34;。

所以设置它的好方法是:

main.ts

/// <reference path="one.ts" />
/// <reference path="two.ts" />
class Main{
    constructor(){
        new One();
        new Two();
    }
}
new Main();

然后从其他文件中删除引用。

答案 1 :(得分:0)

错误的差异可以解释为语言服务与编译器的区别。

&#39;重载签名必须全部是环境或非环境的&#39;可以用以下

解释错误
declare module foo{}
module foo{}

解决方案:使用带有--noResolve编译器标志的外部模块。