我正在学习nestjs
,现在有了一个像下面这样的方法装饰器:
# my.decorator.ts
export function MyDecorator(): MethodDecorator {
return (
target: object,
key: string | symbol,
descriptor: PropertyDescriptor
) => {
// output reflection metadata
console.log(target, key);
console.log(Reflect.getMetadata('design:type', target, key));
console.log(Reflect.getMetadata('design:paramtypes', target, key));
SetMetadata(MY_DECORATOR_METADATA, true)(target, key, descriptor);
};
}
# app.service.ts
export class AppService {
// use decorator directly on **test1**
@MyDecorator()
async test1(p1?: string) {
// use decorator dynamically on **test2**
MyDecorator()(AppService.prototype, 'test2', Object.getOwnPropertyDescriptor(AppService.prototype, 'test2'));
return new Promise<string>((resolve) => setTimeout(() => resolve('test1'), 0))
}
async test2(p2?: string) {
return new Promise<string>((resolve) => setTimeout(() => resolve('test2'), 0))
}
}
test1方法与'design:*'元数据工作得很好,但test2方法输出undefined。
如何获取test2的元数据?有帮助吗?
1条答案
按热度按时间2exbekwf1#
我不相信动态装饰器可以做到这一点。Typescript需要知道在编译时调用装饰器的内容,以便知道发出元数据。这就是
design:*
元数据的来源。因此,如果您在运行时运行装饰器,您可以动态修改 custom 元数据,但编译器元数据将不存在。您可以通过确保向方法添加装饰器来解决这个问题,以便在编译时正确地发出tsc,但这也是您所能做的全部