將引數傳遞給類裝飾器

我們可以用另一個函式包裝一個類裝飾器來允許自定義:

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