Achtergrond:
Static-eigenschappen en methoden zijn toegevoegd aan JavaScript-klassen vanaf ES6, maar strikte typificatie van deze elementen is mogelijk gemaakt door TypeScript. In dynamisch JavaScript verschillen static-elementen van de klasse niet qua type van de niet-statische, maar TypeScript stelt je in staat om typeveiligheid en structuur van klassen te creëren rekening houdend met statische leden.
Probleem:
Static-eigenschappen en methoden behoren tot de klasse zelf, en niet tot de instanties ervan. Echter, veel ontwikkelaars verwarren de typificatie van de instantie (via this of de constructor) met de typificatie van de klasse zelf als object. Dit leidt soms tot fouten bij het verwijzen naar statische velden binnen methoden of bij overerving.
Oplossing:
In TypeScript worden statische leden van klassen apart getypeerd van niet-statische:
Voorbeeldcode:
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; }
Belangrijkste kenmerken:
Kunnen static-methoden rechtstreeks werken met niet-statische eigenschappen van de klasse?
Nee, static-methoden hebben geen toegang tot niet-statische eigenschappen via this, omdat this verwijst naar de klasse zelf (constructor). Om met niet-statische eigenschappen te werken, moet je werken met instanties van het object.
class Demo { static demoStatic() { // this.value; // Fout — value is niet static } }
Kan je toegang krijgen tot een static-eigenschap via een instantie van de klasse?
Nee, toegang tot static-eigenschappen is alleen mogelijk via de naam van de klasse zelf, niet via de instantie:
const u = new User('Max'); console.log(u.count); // Fout console.log(User.count); // OK
Kun je static-methoden overerven en overschrijven bij de overerving van een klasse?
Ja, static-methoden kunnen worden overgeërfd en overschreven, en dit werkt zoals verwacht:
class Animal { static who() { return 'Animal'; } } class Dog extends Animal { static who() { return 'Dog'; } } console.log(Dog.who()); // 'Dog'
Een ontwikkelaar houdt een teller van gemaakte instanties bij als een gewoon eigenschap van de instantie, en niet als static. Bij elke creatie van een object wordt het veld verhoogd, maar het is niet gesynchroniseerd voor alle objecten van de klasse.
Voordelen:
Nadelen:
Gebruik van static count voor het bijhouden van alle objecten, correcte verhoging in de constructor en een statische methode voor het verkrijgen van de teller.
Voordelen:
Nadelen: