Jak zdefiniować usługę AngularJS przy użyciu klasy TypeScript, która nie zanieczyszcza globalnego zakresu?

Używam AngularJS i TypeScript. Chcę zaimplementować usługę AngularJS za pomocą klasy Typescript, jak poniżej:

class HelloService {
    public getWelcomeMessage():String {
        return "Hello";
    }
}

angular.module('app.services.helloService', []).factory('helloService', () => {
    return new HelloService();
});

Kompiluje się do następującego kodu javascript:

var HelloService = (function () {
    function HelloService() {
    }
    HelloService.prototype.getWelcomeMessage = function () {
        return "Hello";
    };
    return HelloService;
})();

angular.module('app.services.helloService', []).factory('helloService', function () {
    return new HelloService();
});

To zanieczyszcza globalną przestrzeń nazw zmienną HelloService, której oczywiście nie chcę. (Korzystając z konsoli Chrome, zweryfikowałem, że HelloService jest obiektem.) Jak mogę rozwiązać / uniknąć tego problemu?

Próbowałem tego, co oczywiste:

angular.module('app.services.helloService', []).factory('helloService', function () {
    class HelloService { ...} 
    return new HelloService();
});

ale to daje mi błąd kompilacji („Nieoczekiwany token;” oświadczenie „oczekiwany”).

Jedno z możliwych rozwiązań, które mogę sobie wyobrazić, to jakoś zaimportować i wyeksportować TypeScript, który z kolei użyje RequireJS. Prawdopodobnie spowoduje to zawarcie HelloService w ramach funkcji definiującej, dzięki czemu uniknie się zanieczyszczenia globalnego zasięgu HelloService. Jednak na razie nie chcę używać RequireJS w mojej aplikacji AngularJS, ponieważ uważam, że AngularJS jest wystarczająco dobry do mojego użytku i dodaje złożoności.

Więc moje pytanie brzmi: jak mogę zdefiniować usługę AngularJS przy użyciu klasy TypeScript, która nie zanieczyszcza globalnego zasięgu?

questionAnswers(4)

yourAnswerToTheQuestion