如何在TypeScript中将其他参数传递给属性修饰器?

时间:2016-01-22 16:02:52

标签: typescript decorator

我有一个简单的类,其中包含一个应用了property decorator的属性:

class MyClass {
    @collectionMember
    public myProperty: number[];

    // ...
}

装饰器功能:

function collectionMember(target: Object, propertyKey: string | symbol): void {
    // ...
}

如何将其他参数传递给装饰器函数?我试着做以下事情但没有用:

class MyClass {
    @collectionMember("MyProp")
    public myProperty: number[];

    // ...
}

显然,这会产生错误

  

提供的参数与呼叫目标的任何签名都不匹配。

1 个答案:

答案 0 :(得分:17)

可以使用装饰工厂来完成。

工厂,只是一个接收你想要的任何参数的函数,并返回一个带有装饰器签名的函数:

// any parameters, even optional ones!
function collectionMember(a: string, b?: number) {
    // the original decorator
    function actualDecorator(target: Object, property: string | symbol): void {
        // do something with the stuff
        console.log(a);
        console.log(target);
    }

    // return the decorator
    return actualDecorator;
}

然后你可以像你描述的那样使用它。

class MyClass {
    @collectionMember('MyProp') // 2nd parameter is not needed for this array
    public myProperty: number[] = [1, 2, 3, 4, 5];

    // ...
}