TypeScript
Класс декоратора
Поиск…
параметры
параметр | подробности |
---|---|
цель | Класс, оформленный |
Декоративный декор класса
Декоратор класса - это просто функция, которая берет класс в качестве единственного аргумента и возвращает его после выполнения с ним чего-либо:
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" }