Chciałem przejść do TypeScript z tradycyjnego JS, ponieważ podoba mi się składnia podobna do C #. Mój problem polega na tym, że nie mogę dowiedzieć się, jak zadeklarować klasy statyczne w TypeScript.
W języku C # często używam klas statycznych do organizowania zmiennych i metod, umieszczając je razem w nazwanej klasie, bez konieczności tworzenia obiektu. W waniliowym JS robiłem to za pomocą prostego obiektu JS:
var myStaticClass = {
property: 10,
method: function(){}
}
W TypeScript wolałbym raczej wybrać moje podejście C-sharpy, ale wydaje się, że klasy statyczne nie istnieją w TS. Jakie jest właściwe rozwiązanie tego problemu?
źródło
.js
w swoimhtml
. WięcAngular 2
prawdopodobnie używaszSystem
... tak zrobiszSystem.import("Folder/M");
(lub jakąkolwiek ścieżkę do skompilowanego.js
pliku) przedbootstrap import
Klasy abstrakcyjne były pierwszorzędnym obywatelem języka TypeScript od czasu TypeScript 1.6. Nie można utworzyć wystąpienia klasy abstrakcyjnej.
Oto przykład:
źródło
Singleton
dotyczy wzorca pamięci współdzielonej tej samej instancji klasy. Ponadto klasa statyczna z definicji nie ma instancji, więc jeśli klient próbuje ją zainicjować, należy zgłosić wyjątek.abstract
słowo kluczowe jest obsługiwane w TypeScript.abstract
! @KimchiMan - świetny pomysł!Definiowanie statycznych właściwości i metod klasy jest opisane w 8.2.1 Specyfikacji języka Typescript :
gdzie
Point.distance()
jest metodą statyczną (lub „klasową”).źródło
To pytanie jest dość przestarzałe, ale chciałem zostawić odpowiedź, która wykorzystuje aktualną wersję języka. Niestety, klasy statyczne nadal nie istnieją w TypeScript, jednak można napisać klasę, która zachowuje się podobnie z niewielkim narzutem, używając prywatnego konstruktora, który zapobiega tworzeniu instancji klas z zewnątrz.
Ten fragment pozwoli ci na użycie "statycznych" klas podobnych do ich odpowiedników w C #, z tą jedyną wadą, że nadal jest możliwe utworzenie ich od wewnątrz. Na szczęście nie można jednak rozszerzać klas za pomocą prywatnych konstruktorów.
źródło
To jest jeden sposób:
__static_ctor
tutaj jest natychmiast wywołane wyrażenie funkcyjne. Typescript wyświetli kod wywołujący go na końcu wygenerowanej klasy.Aktualizacja: W przypadku typów ogólnych w konstruktorach statycznych, do których statyczne elementy członkowskie nie mogą już odwoływać się, potrzebujesz teraz dodatkowego kroku:
W każdym razie, oczywiście, możesz po prostu wywołać konstruktor statyczny typu ogólnego po klasie, na przykład:
Pamiętaj tylko, aby NIGDY nie używać
this
w__static_ctor
powyższym (oczywiście).źródło
class SomeClass {}
generuje konstruktora - nie warto go komentować, jakby wprowadzono nowy numer. ;) FYI: Nie ma prawdziwych "konstruktorów" w JS - tylko funkcje, które mają "this", gdy są wywoływane na obiektach lub vianew
. To istnieje bez względu na każdą „klasę”.Dzisiaj (31/07/2018) otrzymałem ten sam przypadek użycia i stwierdziłem, że jest to obejście. Jest oparty na moich badaniach i zadziałał dla mnie. Oczekiwanie - aby osiągnąć następujące wyniki w języku TypeScript:
Ja to zrobiłem:
Dlatego konsumujemy go jak poniżej:
To zadziałało dla mnie. Jeśli ktoś ma inne lepsze sugestie, niech nas wszyscy o tym posłuchają !!! Dzięki...
źródło
Klasy statyczne w językach takich jak C # istnieją, ponieważ nie ma innych konstrukcji najwyższego poziomu do grupowania danych i funkcji. Jednak w JavaScript tak się dzieje, więc o wiele bardziej naturalne jest po prostu zadeklarowanie obiektu, tak jak to zrobiłeś. Aby dokładniej naśladować składnię klasy, możesz zadeklarować takie metody:
źródło
Zobacz http://www.basarat.com/2013/04/typescript-static-constructors-for.html
Jest to sposób na „sfałszowanie” statycznego konstruktora. Nie jest to pozbawione niebezpieczeństw - zobacz przywoływany element codeplex .
źródło
Jednym z możliwych sposobów osiągnięcia tego jest posiadanie statycznych instancji klasy w innej klasie. Na przykład:
Następnie można uzyskać dostęp do parametrów za pomocą Wrappera, bez konieczności deklarowania jego instancji. Na przykład:
Otrzymujesz więc zalety obiektu typu JavaScript (jak opisano w oryginalnym pytaniu), ale z korzyściami wynikającymi z możliwości dodania pisania TypeScript. Ponadto unika się konieczności dodawania słowa „static” przed wszystkimi parametrami w klasie.
źródło
Dzięki zewnętrznym modułom ES6 można to osiągnąć w następujący sposób:
Zapobiega to użyciu wewnętrznych modułów i przestrzeni nazw, co jest uważane za złą praktykę przez TSLint [1] [2] , pozwala na prywatne i publiczne określanie zakresu oraz zapobiega inicjalizacji niechcianych obiektów klas.
źródło
Szukałem czegoś podobnego i trafiłem na coś, co nazywa się
Singleton Pattern
.Odniesienie: Singleton Pattern
źródło
Możesz również użyć słowa kluczowego
namespace
do uporządkowania zmiennych, klas, metod i tak dalej. Zobacz dokźródło