Ich konvertiere eine Angular App, um TypeScript zu verwenden, aber das ist eine allgemeine TypeScript-Frage, nicht über Angular. Die Winkel js Dateien sind entlang der Linien:TypeScript - sie muss es haben? (wo es == globaler Gültigkeitsbereich)
(function() {
var app = angular.module('myModule', []);
app.controller('myController', ['$scope',
function ($scope) {
$scope.myNewProperty = "Bob";
}
]);
})();
Und ich habe umgewandelt, das zu schönen Typoskript Klasse Syntax:
class myController {
constructor($scope) {
$scope.myNewProperty = "Bob";
}
}
angular.module('myModule', []).controller("myController", myController);
Alle funktioniert gut, mit Ausnahme der erzeugte JS wird nach dem JS nicht umgebrochen Modulmuster (dh in einer äußeren anonymen Funktion):
So myController ist jetzt global. Wenn ich die Klasse in einem Typoskript Modul setzen, dann erzeugt die js mit dem Modulnamen als globale Variable:
var TsModule;
(function (TsModule) {
var myController = (function() {
app.controller('myController', ['$scope',
function ($scope) {
$scope.myNewProperty = "Bob";
}
]);
})();
var app = angular.module('myModule', []);
})(TsModule || (TsModule = {}));
Wie verhindere ich, Typoskript den globalen Bereich auf diese Weise umweltfreundlich? Ich will nur, dass alles in einem netten lokalen Rahmen verpackt ist. Ich habe gesehen, dass es an anderer Stelle sagte "einfach zurück zu der alten JS-Syntax" (d. H. Keine TypeScript-Klasse). How can I define an AngularJS service using a TypeScript class that doesn't pollute the global scope?
Aber der ganze Sinn von uns mit TypeScript/ist/die Klassensyntax. Ist TypeScript im Widerspruch zu irgendeinem (vernünftigen) JS-Programmierer, der nicht global sein will?
Schon eine Weile her, seit ich TypScript verwendet habe, also könnte ich auf diesem einen sein, aber haben Sie versucht, den oben genannten TypeScript-Code in einer sofort aufgerufenen Lambda-Funktion zu verpacken? '(() => { // Code hier ... })();' –
Ich bekomme die Frustration, aber die Verwendung eines einzigen, wohldefinierten Modulnamens für all Ihre Dateien verschmutzt den globalen Geltungsbereich kaum. Es wird eine einzelne Variable im globalen Gültigkeitsbereich erstellen und selbst dann, wenn Sie Ihre Klassen nicht exportieren, wird es niemals mehr als ein leeres Objekt sein. Das ist ein ziemlich kleines Problem. – Josh
Nur FYI (Sie könnten bereits wissen) Klasse Ausdrücke kommen in TS nächsten, die sie in IIFE erlauben. Auch für OP könnte dieses Video (ich gemacht habe) zu Modulmustern in TypeScript für Sie nützlich sein: https://www.youtube.com/watch?v=KDrWLMUY0R0&hd=1 – basarat