TypeScript
Klasse Dekorateur
Suche…
Parameter
Parameter | Einzelheiten |
---|---|
Ziel | Die Klasse wird dekoriert |
Grundklasse Dekorateur
Ein Klassendekorateur ist nur eine Funktion, die die Klasse als einziges Argument aufnimmt und zurückgibt, nachdem sie etwas getan hat:
function log<T>(target: T) {
// Do something with target
console.log(target);
// Return target
return target;
}
Dann können wir den Klassendekorateur auf eine Klasse anwenden:
@log
class Person {
private _name: string;
public constructor(name: string) {
this._name = name;
}
public greet() {
return this._name;
}
}
Generierung von Metadaten mit einem Klassendekorateur
Dieses Mal werden wir einen Klassendekorateur deklarieren, der einer Klasse einige Metadaten hinzufügt, wenn wir ihn anwenden:
function addMetadata(target: any) {
// Add some metadata
target.__customMetadata = {
someKey: "someValue"
};
// Return target
return target;
}
Wir können dann den Klassendekorateur anwenden:
@addMetadata
class Person {
private _name: string;
public constructor(name: string) {
this._name = name;
}
public greet() {
return this._name;
}
}
function getMetadataFromClass(target: any) {
return target.__customMetadata;
}
console.log(getMetadataFromClass(Person));
Der Dekorator wird angewendet, wenn die Klasse nicht deklariert wird, nicht wenn wir Instanzen der Klasse erstellen. Dies bedeutet, dass die Metadaten von allen Instanzen einer Klasse gemeinsam genutzt werden:
function getMetadataFromInstance(target: any) {
return target.constructor.__customMetadata;
}
let person1 = new Person("John");
let person2 = new Person("Lisa");
console.log(getMetadataFromInstance(person1));
console.log(getMetadataFromInstance(person2));
Argumente an einen Klassendekorateur übergeben
Wir können einen Klassendekorateur mit einer anderen Funktion umschließen, um die Anpassung zu ermöglichen:
function addMetadata(metadata: any) {
return function log(target: any) {
// Add metadata
target.__customMetadata = metadata;
// Return target
return target;
}
}
Das addMetadata
nimmt einige als Konfiguration verwendete Argumente und gibt dann eine unbenannte Funktion zurück, die der eigentliche Dekorateur ist. Im Dekorateur können wir auf die Argumente zugreifen, da eine Schließung vorhanden ist.
Wir können den Dekorator dann aufrufen, indem er einige Konfigurationswerte übergibt:
@addMetadata({ guid: "417c6ec7-ec05-4954-a3c6-73a0d7f9f5bf" })
class Person {
private _name: string;
public constructor(name: string) {
this._name = name;
}
public greet() {
return this._name;
}
}
Wir können die folgende Funktion verwenden, um auf die generierten Metadaten zuzugreifen:
function getMetadataFromClass(target: any) {
return target.__customMetadata;
}
console.log(getMetadataFromInstance(Person));
Wenn alles richtig lief, sollte die Konsole Folgendes anzeigen:
{ guid: "417c6ec7-ec05-4954-a3c6-73a0d7f9f5bf" }