Sök…


parametrar

Parameter detaljer
mål Klassen som dekoreras

Grundläggande klassdekoratör

En klassdekoratör är bara en funktion som tar klassen som sitt enda argument och returnerar den efter att ha gjort något med det:

function log<T>(target: T) {
    
    // Do something with target
    console.log(target);
    
    // Return target
    return target;

}

Vi kan sedan tillämpa klassdekoratören på en klass:

@log
class Person {
    private _name: string;
    public constructor(name: string) {
        this._name = name;
    }
    public greet() {
        return this._name;
    }
}

Generera metadata med en klassdekoratör

Den här gången kommer vi att förklara en klassdekoratör som kommer att lägga till några metadata till en klass när vi ansökte om den:

function addMetadata(target: any) {
    
    // Add some metadata
    target.__customMetadata = {
        someKey: "someValue"
    };
    
    // Return target
    return target;

}

Vi kan sedan tillämpa klassdekoratören:

@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));

Dekoratören appliceras när klassen förklaras inte när vi skapar instanser av klassen. Detta innebär att metadata delas över alla instanser av en klass:

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));

Överför argument till en klassinredare

Vi kan linda in en klassdekoratör med en annan funktion för att tillåta anpassning:

function addMetadata(metadata: any) {
    return function log(target: any) {
    
        // Add metadata
        target.__customMetadata = metadata;
        
        // Return target
        return target;
    
    }
}

addMetadata tar några argument som används som konfiguration och returnerar sedan en namngiven funktion som är den verkliga dekoratören. I dekoratören kan vi komma åt argumenten eftersom det finns en stängning på plats.

Vi kan sedan åberopa dekoratören som passerar några konfigurationsvärden:

@addMetadata({ guid: "417c6ec7-ec05-4954-a3c6-73a0d7f9f5bf" })
class Person {
    private _name: string;
    public constructor(name: string) {
        this._name = name;
    }
    public greet() {
        return this._name;
    }
}

Vi kan använda följande funktion för att komma åt de genererade metadata:

function getMetadataFromClass(target: any) {
    return target.__customMetadata;
}

console.log(getMetadataFromInstance(Person));

Om allt gick rätt skulle konsolen visa:

{ guid: "417c6ec7-ec05-4954-a3c6-73a0d7f9f5bf" } 


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow