Zoeken…


parameters

Parameter Details
doelwit De klas wordt versierd

Decorateur van basisklasse

Een klassedecorateur is slechts een functie die de klasse als het enige argument neemt en deze teruggeeft nadat hij er iets mee heeft gedaan:

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

}

We kunnen de klassedecorateur vervolgens op een klas toepassen:

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

Metadata genereren met behulp van een klassendecorateur

Deze keer gaan we een klasse-decorateur verklaren die wat metadata aan een klasse zal toevoegen wanneer we het toepassen:

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

}

We kunnen dan de klassendecorateur toepassen:

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

De decorateur wordt toegepast wanneer de klasse niet wordt verklaard wanneer we instanties van de klasse maken. Dit betekent dat de metagegevens worden gedeeld over alle instanties van een klasse:

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

Argumenten doorgeven aan een klassendecorateur

We kunnen een klasse-decorateur omwikkelen met een andere functie om aanpassing mogelijk te maken:

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

De addMetadata neemt enkele argumenten die als configuratie worden gebruikt en retourneert vervolgens een naamloze functie die de eigenlijke decorateur is. In de decorateur hebben we toegang tot de argumenten omdat er een sluiting is.

We kunnen de decorateur vervolgens aanroepen om enkele configuratiewaarden door te geven:

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

We kunnen de volgende functie gebruiken om toegang te krijgen tot de gegenereerde metagegevens:

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

console.log(getMetadataFromInstance(Person));

Als alles goed is gegaan, zou de console het volgende moeten weergeven:

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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow