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" } 


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow