我在类型脚本生成的js文件中遇到问题,但无法解决,这是我在服务文件中遇到的问题:

namespace Providers {

    export interface IProvider {
        loadTranslations(translations: ITranslations, locale: string);
    }
    module.provider('lego', LegoProvider);

    class LegoProvider implements ng.IServiceProvider ,IProvider{

        loadTranslations(translations:ITranslations , locale: string) {
            ......
        }

        $get() {
            .....
        }
    }

}


生成的js文件为:

var Providers;
(function (Providers) {
    module.provider('lego', LegoProvider); // this is the problem
var LegoProvider = (function () {
    function LegoProvider() {
}
LegoProvider.prototype.loadTranslations = function (translations, locale) {
};
LegoProvider.prototype.$get = function () {
};
return LegoProvider;
}());
})(Providers || (Providers = {}));


由于LegoProvider是可变的,因此抛出错误,并且在该行中仍未定义。当我以此更改代码时,它可以正常工作:

namespace Providers {

    export interface IProvider {
        loadTranslations(translations: ITranslations, locale: string);
    }


    class LegoProvider implements ng.IServiceProvider ,IProvider{

        loadTranslations(translations:ITranslations , locale: string) {
            ......
        }

        $get() {
            .....
        }
    }
    module.provider('lego', LegoProvider); // I've moved this line to bottom

}


在打字稿代码中,可以从两个位置访问LegoProvider类,并且对我来说第一个位置不起作用没有任何意义

最佳答案

它看起来像一个经典的吊装问题:

生成的js文件具有一个提供程序,该提供程序实际上是一个构造函数,该函数存储在变量中(准确地说是IIFE):

var LegoProvider = (function () {
    function LegoProvider() { ...


当您将提供程序注册到您的应用程序时,该变量尚未初始化,仅进行了声明。实际上是这样的:

   var LegoProvider = undefined; // hoisting

   module.provider('lego', LegoProvider);

   LegoProvider = (function () {
       function LegoProvider() { ...


完全初始化LegoProvider类后,您的更正已移动了注册。

10-08 19:04