TypeScript
Klassdekoratör
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" }