Historia kwestii:
Właściwości i metody statyczne pojawiły się w klasach JavaScript od ES6, jednak ścisłe typowanie tych elementów stało się możliwe dzięki TypeScript. W dynamicznym JavaScript elementy statyczne klasy nie różnią się typem od niestatycznych, ale TypeScript umożliwia dodanie bezpieczeństwa typów i struktury klas uwzględniając członków statycznych.
Problem:
Właściwości i metody statyczne należą do samej klasy, a nie do jej instancji. Jednak wielu programistów myli typowanie instancji (przez this lub konstruktor) z typowaniem samej klasy jako obiektu. Często prowadzi to do błędów przy dostępie do pól statycznych wewnątrz metod lub przy dziedziczeniu.
Rozwiązanie:
W TypeScript członkowie statyczni klas są typowani oddzielnie od niestatycznych:
Przykład kodu:
class User { static count: number = 0; name: string; constructor(name: string) { this.name = name; User.count++; } static getCount(): number { return User.count; } } function createUserClass(): typeof User { return User; }
Kluczowe cechy:
Czy metody static mogą bezpośrednio działać na niestatycznych właściwościach klasy?
Nie, metody static nie mają dostępu do niestatycznych właściwości przez this, ponieważ this odnosi się do samej klasy (konstruktora). Aby pracować z niestatycznymi właściwościami, należy operować na instancjach obiektu.
class Demo { static demoStatic() { // this.value; // Błąd — value nie jest static } }
Czy można uzyskać dostęp do właściwości static przez instancję klasy?
Nie, dostęp do właściwości static jest możliwy tylko przez samo imię klasy, a nie przez instancję:
const u = new User('Max'); console.log(u.count); // Błąd console.log(User.count); // OK
Czy można dziedziczyć i nadpisywać metody static przy dziedziczeniu klasy?
Tak, metody static można dziedziczyć i nadpisywać, i będzie to działać zgodnie z oczekiwaniami:
class Animal { static who() { return 'Animal'; } } class Dog extends Animal { static who() { return 'Dog'; } } console.log(Dog.who()); // 'Dog'
Programista przechowuje licznik stworzonych instancji jako zwykłą właściwość instancji, a nie jako static. Przy każdym stworzeniu obiektu pole wzrasta, ale nie jest synchronizowane dla wszystkich obiektów klasy.
Zalety:
Wady:
Użycie static count do liczenia wszystkich obiektów, poprawne zwiększanie w konstruktorze i statyczna metoda do uzyskania licznika.
Zalety:
Wady: