TypeScript
Dekorator klasy
Szukaj…
Parametry
Parametr | Detale |
---|---|
cel | Klasa jest dekorowana |
Dekorator klasy podstawowej
Dekorator klas to po prostu funkcja, która bierze klasę za jedyny argument i zwraca ją po zrobieniu z nią czegoś:
function log<T>(target: T) {
// Do something with target
console.log(target);
// Return target
return target;
}
Następnie możemy zastosować dekorator klasy do klasy:
@log
class Person {
private _name: string;
public constructor(name: string) {
this._name = name;
}
public greet() {
return this._name;
}
}
Generowanie metadanych przy użyciu dekoratora klas
Tym razem zadeklarujemy dekorator klas, który doda pewne metadane do klasy, kiedy ją zastosujemy:
function addMetadata(target: any) {
// Add some metadata
target.__customMetadata = {
someKey: "someValue"
};
// Return target
return target;
}
Następnie możemy zastosować dekorator klasy:
@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));
Dekorator jest stosowany, gdy klasa jest zadeklarowana, a nie podczas tworzenia instancji klasy. Oznacza to, że metadane są współużytkowane przez wszystkie instancje klasy:
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));
Przekazywanie argumentów dekoratorowi klas
Możemy owinąć dekoratora klas inną funkcją, aby umożliwić dostosowanie:
function addMetadata(metadata: any) {
return function log(target: any) {
// Add metadata
target.__customMetadata = metadata;
// Return target
return target;
}
}
addMetadata
przyjmuje niektóre argumenty używane jako konfiguracja, a następnie zwraca nienazwaną funkcję, która jest faktycznym dekoratorem. W dekoratorze możemy uzyskać dostęp do argumentów, ponieważ ma miejsce zamknięcie.
Następnie możemy wywołać dekorator przekazując pewne wartości konfiguracyjne:
@addMetadata({ guid: "417c6ec7-ec05-4954-a3c6-73a0d7f9f5bf" })
class Person {
private _name: string;
public constructor(name: string) {
this._name = name;
}
public greet() {
return this._name;
}
}
Możemy użyć następującej funkcji, aby uzyskać dostęp do wygenerowanych metadanych:
function getMetadataFromClass(target: any) {
return target.__customMetadata;
}
console.log(getMetadataFromInstance(Person));
Jeśli wszystko poszło dobrze, konsola powinna wyświetlić:
{ guid: "417c6ec7-ec05-4954-a3c6-73a0d7f9f5bf" }