我有一个装饰师,什么都不做:
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);
但我得到的只是"未定义"。这可能与反射元数据有关,还是我完全错了?
答案 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);
根据需要。