Поиск…


параметры

параметр подробности
цель Класс, оформленный

Декоративный декор класса

Декоратор класса - это просто функция, которая берет класс в качестве единственного аргумента и возвращает его после выполнения с ним чего-либо:

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

}

Затем мы можем применить декоратор класса к классу:

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

Создание метаданных с использованием декоратора класса

На этот раз мы собираемся объявить декоратор класса, который добавит некоторые метаданные в класс, когда мы обратились к нему:

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

}

Затем мы можем применить декоратор класса:

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

Декоратор применяется, когда класс объявляется не тогда, когда мы создаем экземпляры класса. Это означает, что метаданные являются общими для всех экземпляров класса:

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

Передача аргументов декоратору класса

Мы можем обернуть декоратор класса другой функцией, чтобы можно было настроить:

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

addMetadata принимает некоторые аргументы, используемые в качестве конфигурации, а затем возвращает неназванную функцию, которая является фактическим декоратором. В декораторе мы можем получить доступ к аргументам, потому что есть закрытие на месте.

Затем мы можем вызвать декоратора, передающего некоторые значения конфигурации:

@addMetadata({ guid: "417c6ec7-ec05-4954-a3c6-73a0d7f9f5bf" })
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(getMetadataFromInstance(Person));

Если все пошло правильно, консоль должна отображать:

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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow