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" } 


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow