reflect-metadata和查询装饰器的对象

时间:2017-05-02 08:42:46

标签: typescript

我有一个装饰师,什么都不做:

export function myDecorator(target: any, key: string) {
   var t = Reflect.getMetadata("design:type", target, key);
}

我将这个装饰器与类的属性一起使用:

export class SomeClass {

    @globalVariable
    someProperty: string;

    @globalVariable
    fakeProperty: number;
}

现在,我想要做的是,获取用@globalVariable装饰器修饰的类的所有属性。

我尝试使用" reflect-metadata"用:

Reflect.getMetadata('globalVariable', this);

但我得到的只是"未定义"。这可能与反射元数据有关,还是我完全错了?

2 个答案:

答案 0 :(得分:1)

在定义类时,属性修饰符在类中的每个属性定义中调用一次。

这意味着如果使用@myDecorator:

装饰SomeClass中的属性
export class SomeClass {
    @myDecorator
    someProperty: string;
}

然后将调用myDecorator函数:
target :( SomeClass定义)
key :(属性的名称)

通过“emitDecoratorMetadata”属性启用元数据时,TypeScript编译器将生成以下元数据属性:

'design:type''design:paramtypes''design:returntype'

然后,您可以使用上述任何键调用Reflect.getMetadata。即:

Reflect.getMetadata('design:type', ...)
Reflect.getMetadata('design:paramtypes',...)
Reflect.getMetadata('design:returntype', ...)

您无法使用装饰器的名称调用Reflect.getMetadata。

答案 1 :(得分:0)

您需要以以下方式实现globalVariable:

function globalVariable(target: any, propertyKey: string | Symbol): void {
    let variables = Reflect.getOwnMetadata("globalVariable", target.constructor) || [];
    variables.push(propertyKey);
    Reflect.defineMetadata("globalVariable", variables, target.constructor);
}

然后,在运行时,您将可以致电

Reflect.getMetadata('globalVariable', this);

根据需要。