TypeScript - 她必须拥有它吗?(其中= =全球范围)

use*_*563 6 javascript scope angularjs typescript

我正在转换Angular应用程序以使用TypeScript,但这是一个普通的TypeScript问题,而不是Angular.角度js文件是沿着这条线:

(function () {
  var app = angular.module('myModule', []);
  app.controller('myController', ['$scope',
    function ($scope) {
      $scope.myNewProperty = "Bob";
    }
  ]);
})();
Run Code Online (Sandbox Code Playgroud)

我已将其转换为可爱的TypeScript类语法:

class myController {
    constructor($scope) {
        $scope.myNewProperty = "Bob";
    }
}

angular.module('myModule', []).controller("myController", myController);
Run Code Online (Sandbox Code Playgroud)

一切正常,除了生成的JS没有根据JS模块模式(即在外部匿名函数中)包装:

var myController =     (function () {
      app.controller('myController', ['$scope',
        function ($scope) {
          $scope.myNewProperty = "Bob";
        }
      ]);
    })();

var app = angular.module('myModule', []);
Run Code Online (Sandbox Code Playgroud)

所以myController现在是全球性的.如果我将类放在TypeScript模块中,那么js将使用模块名称作为全局变量生成:

var TsModule;
(function (TsModule) {
    var myController =     (function () {
          app.controller('myController', ['$scope',
            function ($scope) {
              $scope.myNewProperty = "Bob";
            }
          ]);
        })();

    var app = angular.module('myModule', []);
})(TsModule || (TsModule = {}));
Run Code Online (Sandbox Code Playgroud)

如何以这种方式阻止TypeScript污染全局范围?我只是希望它包含在一个很好的本地范围内.我已经看到它在别处说过"回到旧的JS语法"(即没有TypeScript类). 如何使用不污染全局范围的TypeScript类定义AngularJS服务?

但是我们使用TypeScript /的全部意义是/ class语法.TypeScript与任何知道不会走向全球的(明智的)JS程序员不一致吗?

Jos*_*osh 4

你可以简单地将你的类包装在一个module

模块本身将是全局的,但是如果您不导出该类,则不必担心单个模块名称会污染全局范围。

所以这个打字稿:

module MyModule {
  class MyClass {
     constructor(){}
  }
}
Run Code Online (Sandbox Code Playgroud)

会产生如下JS:

var MyModule;
(function (MyModule) {
    var MyClass = (function () {
        function MyClass() {
        }
        return MyClass;
    })();
})(MyModule || (MyModule = {}));
Run Code Online (Sandbox Code Playgroud)