Vad betyder <T extends { new(...args: any[]): {} }>(constructor:T) i TypeScript?


Behöver varje TypeScript-dekoratör definiera detta? Vad betyder detta? Varför inte sätta detta som standard i TypeScript-språket eller måste utvecklaren skriva detta varje gång.

function classDecorator<T extends {new(...args:any[]):{}}>(constructor:T) {}

Svar #1

En dekoratör behöver som parameter ett objekt som inkluderar en konstruktor. Detta objekt kan instansiera olika klasser, därför måste du använda en generisk funktion. Därför behöver du en funktion som ser ut så här function classDecorator<T>(constructor:T) {} Där T ersätts av en klass eller en typ. Till exempel kan du kalla funktionen så här: classDecorator<MyClass>(myClass) (Se mer om Generics här: https://www.typescriptlang.org/docs/handbook/generics.html).

För att begränsa de typklasser som classDecorator kan använda, specificerar du det efter extends: extends {new(...args:any[]):{}}. Du säger i princip att din klass behöver en konstruktor i sin definition genom detta (new...).

Enligt min kunskap är det inte inställt som standardmall helt enkelt därför att dekoratörsmönstret inte är specifikt definierat i TypeScript-definitionen såväl som många andra befintliga mönster.