打字稿不以一致的顺序编译类



我使用TypeScript和Angular具有MVC 5项目。我有三个TS文件:为了简化,我们将其称为Controller1.ts,Controller2.TS和App.ts。问题在于,当我第一次启动程序时,通常(但并非总是)编译的一切都很好,并且按正确的顺序汇编。但是,一旦我更改某些内容并再次保存以触发重新编译,它就会更改输出的App.js中类的顺序,这会导致App.ts的内容(创建Angular App的创建)在一个之前运行或两个控制器都定义了,引发了此错误:

[ng:areq] Argument 'ProviderScorecardController' is not a function, got undefined

这是我定义app.ts文件的方式:

/// <reference path="_app.d.ts" />
module mqApp {
'use strict';
    if (typeof (angular) != "undefined") {
        var modules = [];
        angular.module("mqApp", modules)
            .controller("Controller1", Controller1)
            .controller("Controller2", Controller2);
    }
}

两个控制器都与此相同,除了类名:

/// <reference path="../../_app.d.ts" />
module mqApp {
    'use strict';
    export class Controller1 {
        public static $inject = [
            '$scope'
        ];
        private scope: angular.IScope;
        constructor($scope: angular.IScope) {
            this.scope = $scope;
            console.log("Master Controller Instantiated");
        }
    }
}

我的_app.d.t.ts文件,该文件是从上面的TS文件链接的:

/// <reference path="_references.d.ts" /> [This just contains angular/jquery references]
/// <reference path="code/controllers/Controller2.ts" />
/// <reference path="code/controllers/Controller1.ts" />
/// <reference path="app.ts" />

更改参考的顺序没有影响。我究竟做错了什么?为什么它不始终按正确的顺序进行编译?

我正在运行Angular 1.6和打字稿1.8。

我很确定这是因为编译器试图在文件之间构建依赖性树,但是在这种情况下,它是圆形的,因此编译顺序可能不是您的'd期望。

所有文件都引用此一个_app.d.ts文件,这意味着每个文件都取决于所有文件。
加载库(例如typings所做的)时,单个d.ts文件的使用是一个很好的做法,因为这些库不依赖您的源文件,因此没有循环依赖性的风险。

在您的情况下应该是:

// app.ts file
/// <reference path="./_references.d.ts" />
/// <reference path="./code/controllers/Controller1.ts" />
/// <reference path="./code/controllers/Controller2.ts" />
...

和:

// Controller1.ts
/// <reference path="./_references.d.ts" />
...

您可以创建共享共同需求的d.ts文件,但请确保您不会最终绕圈。

最新更新