【发布时间】:2015-02-08 20:54:48
【问题描述】:
我正在将 Angular 应用程序转换为使用 TypeScript,但这是一个通用的 TypeScript 问题,与 Angular 无关。 角度js文件是这样的:
(function () {
var app = angular.module('myModule', []);
app.controller('myController', ['$scope',
function ($scope) {
$scope.myNewProperty = "Bob";
}
]);
})();
我已将其转换为可爱的 TypeScript 类语法:
class myController {
constructor($scope) {
$scope.myNewProperty = "Bob";
}
}
angular.module('myModule', []).controller("myController", myController);
一切正常,除了生成的 JS 没有按照 JS 模块模式包装(即在外部匿名函数中):
var myController = (function () {
app.controller('myController', ['$scope',
function ($scope) {
$scope.myNewProperty = "Bob";
}
]);
})();
var app = angular.module('myModule', []);
所以 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 = {}));
如何阻止 TypeScript 以这种方式污染全局范围?我只想将它全部包裹在一个不错的本地范围内。 我在别处看到它说“回到旧的 JS 语法”(即没有 TypeScript 类)。 How can I define an AngularJS service using a TypeScript class that doesn't pollute the global scope?
但是我们使用 TypeScript 的重点是 / 是 / 类语法。 TypeScript 是否与任何(明智的)知道不走向全球的 JS 程序员格格不入?
【问题讨论】:
-
自从我使用 TypeScript 以来已经有一段时间了,所以我可能会停止使用这个,但是您是否尝试过将上面的 TypeScript 代码包装在一个立即调用的 lambda 函数中?
(() => { // Code here... })(); -
我感到很沮丧,但是为所有文件使用一个定义明确的模块名称几乎不会污染全局范围。它将在全局范围内创建一个变量,即使那样,如果您不导出您的类,那么它永远不会超过一个空对象。这是一个很小的问题。
-
仅供参考(您可能已经知道)类表达式将在 TS 中出现,这将允许它们进入 IIFE。对于 OP,这个关于 TypeScript 模块模式的视频(我制作的)可能对你有用:youtube.com/watch?v=KDrWLMUY0R0&hd=1
-
@AluanHaddad - 是的,他们现在可以了。这在 2014 年 12 月是不允许的。
标签: javascript angularjs scope typescript