Como posso definir um serviço AngularJS usando uma classe TypeScript que não polua o escopo global?

Eu estou usando AngularJS e TypeScript. Eu quero implementar um serviço AngularJS usando uma classe Typescript, assim:

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

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

Isto compila para o seguinte código 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();
});

Isso polui o namespace global com a variável HelloService, que obviamente não quero. (Usando o console do Chrome, verifiquei que o HelloService era um objeto.) Como posso resolver / evitar esse problema?

Eu tentei o óbvio:

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

mas isso me dá um erro de compilação ("Token inesperado; 'declaração' esperada").

Uma possível solução que posso imaginar é usar a importação e exportação do TypeScript de alguma forma, que por sua vez utilizará o RequireJS. Isso provavelmente envolverá o HelloService em uma função define, evitando assim a poluição do escopo global com o HelloService. No entanto, não quero usar o RequireJS no meu aplicativo AngularJS por enquanto, pois acho que o AngularJS é bom o suficiente para meu uso, e isso adiciona complexidade.

Então, minha pergunta é: como posso definir um serviço AngularJS usando uma classe TypeScript que não polua o escopo global?

questionAnswers(4)

yourAnswerToTheQuestion