将参数传递给类装饰器

我们可以用另一个函数包装一个类装饰器来允许自定义:

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