TypeScript
Klasse Decorateur
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" }