Konwertuję aplikację Angular, aby używać TypeScript, ale jest to ogólne pytanie TypeScript, a nie Angular. kątowe pliki js są wzdłuż linii:TypeScript - ona musi to mieć? (gdzie to == globalny zasięg)
(function() {
var app = angular.module('myModule', []);
app.controller('myController', ['$scope',
function ($scope) {
$scope.myNewProperty = "Bob";
}
]);
})();
A ja konwertowane że do pięknej klasy maszynopis składnię:
class myController {
constructor($scope) {
$scope.myNewProperty = "Bob";
}
}
angular.module('myModule', []).controller("myController", myController);
Wszystko działa dobrze, z wyjątkiem wygenerowanym JS nie jest pakowane zgodnie z JS wzór modułu (tj. w zewnętrznej anonimowej funkcji):
var myController = (function() {
app.controller('myController', ['$scope',
function ($scope) {
$scope.myNewProperty = "Bob";
}
]);
})();
var app = angular.module('myModule', []);
Więc myController jest teraz globalny. Jeśli mogę umieścić klasę w module maszynopis, to js generuje z nazwą modułu jako zmienną globalną:
var TsModule;
(function (TsModule) {
var myController = (function() {
app.controller('myController', ['$scope',
function ($scope) {
$scope.myNewProperty = "Bob";
}
]);
})();
var app = angular.module('myModule', []);
})(TsModule || (TsModule = {}));
Jak zatrzymać maszynopis zanieczyszczających zasięg globalny w ten sposób? Chcę tylko, żeby wszystko było zapakowane w miły lokalny zasięg. Widziałem, jak to zostało powiedziane w innym miejscu: "po prostu wróć do starej składni JS" (tzn. Bez klasy TypeScript). How can I define an AngularJS service using a TypeScript class that doesn't pollute the global scope?
Ale naszym celem jest użycie składni języka TypeScript/is/the class. Czy TypeScript jest w sprzeczności z jakimkolwiek (rozsądnym) programistą JS, który wie, że nie chce działać globalnie?
Minęło trochę czasu odkąd użyłem TypeScript, więc mógłbym być wyłączony na tym, ale czy próbowałeś owijać powyższy kod TypeScript w natychmiast wywoływaną funkcję lambda? '(() => { // Kod tutaj ... })();' –
Dostaję frustrację, ale używanie pojedynczej, dobrze zdefiniowanej nazwy modułu dla wszystkich plików praktycznie nie powoduje zanieczyszczenia globalnego zasięgu. Będzie tworzyć pojedynczą zmienną na globalnym zasięgu, a nawet wtedy, jeśli nie eksportujesz swoich klas, to nigdy nie będzie to więcej niż pusty obiekt. To drobny problem. – Josh
Po prostu FYI (możesz już wiedzieć) wyrażeń klas nadchodzi w TS następnie, który pozwoli im w IIFE. Również dla OP ten film wideo (zrobiłem) na wzorcach modułów w TypeScript może ci się przydać: https://www.youtube.com/watch?v=KDrWLMUY0R0&hd=1 – basarat