由typescript编译器生成的js出错

时间:2016-08-08 06:30:01

标签: javascript angularjs typescript

我遇到类型脚本生成的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类,对我来说第一个位置不起作用没有意义

1 个答案:

答案 0 :(得分:1)

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

生成的js文件有一个提供程序,它实际上是一个构造函数,存储在一个变量中(IIFE为percise):

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

当您向应用注册提供商时,该变量尚未初始化,仅被声明。这就是实际发生的事情:

   var LegoProvider = undefined; // hoisting

   module.provider('lego', LegoProvider);

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

您的更正已在LegoProvider课程完全初始化后移动了注册。