Geschichte der Frage:
Statische Eigenschaften und Methoden wurden in JavaScript-Klassen seit ES6 eingeführt, jedoch wurde eine strenge Typisierung dieser Elemente durch TypeScript möglich. In dynamischem JavaScript unterscheiden sich statische Elementen einer Klasse nicht von nicht-statischen, aber TypeScript ermöglicht es, die Typensicherheit und Struktur von Klassen unter Berücksichtigung ihrer statischen Mitglieder hinzuzufügen.
Problem:
Statische Eigenschaften und Methoden gehören zur Klasse selbst und nicht zu ihren Instanzen. Viele Entwickler verwechseln jedoch die Typisierung der Instanz (über this oder den Konstruktor) mit der Typisierung der Klasse selbst als Objekt. Dies führt manchmal zu Fehlern beim Zugriff auf statische Felder innerhalb von Methoden oder beim Vererben.
Lösung:
In TypeScript werden die statischen Mitglieder von Klassen getrennt von den nicht-statischen typisiert:
Beispiel-Code:
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; }
Wesentliche Merkmale:
Können statische Methoden direkt mit nicht-statischen Eigenschaften der Klasse arbeiten?
Nein, statische Methoden haben keinen Zugriff auf nicht-statische Eigenschaften über this, da this auf die Klasse selbst (den Konstruktor) verweist. Um mit nicht-statischen Eigenschaften zu arbeiten, muss man mit Objektinstanzen arbeiten.
class Demo { static demoStatic() { // this.value; // Fehler — value ist nicht static } }
Kann man auf die statische Eigenschaft über eine Instanz der Klasse zugreifen?
Nein, der Zugriff auf statische Eigenschaften ist nur über den Klassennamen selbst und nicht über eine Instanz möglich:
const u = new User('Max'); console.log(u.count); // Fehler console.log(User.count); // OK
Kann man statische Methoden beim Vererben einer Klasse erben und überschreiben?
Ja, statische Methoden können geerbt und überschrieben werden, und das wird wie erwartet funktionieren:
class Animal { static who() { return 'Animal'; } } class Dog extends Animal { static who() { return 'Dog'; } } console.log(Dog.who()); // 'Dog'
Ein Entwickler speichert einen Zähler für erstellte Instanzen als normales Instanzfeld und nicht als static. Bei jeder Erstellung eines Objekts erhöht sich das Feld, ist jedoch nicht für alle Objekte der Klasse synchronisiert.
Vorteile:
Nachteile:
Verwendung von static count zur Zählung aller Objekte, korrektes Erhöhen im Konstruktor und statische Methode zur Abfrage des Zählers.
Vorteile:
Nachteile: