typescript 当动态地使用方法上的装饰器函数时,是否可能获得反射元数据?

axr492tv  于 2023-06-24  发布在  TypeScript
关注(0)|答案(1)|浏览(123)

我正在学习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的元数据?有帮助吗?

2exbekwf

2exbekwf1#

我不相信动态装饰器可以做到这一点。Typescript需要知道在编译时调用装饰器的内容,以便知道发出元数据。这就是design:*元数据的来源。因此,如果您在运行时运行装饰器,您可以动态修改 custom 元数据,但编译器元数据将不存在。您可以通过确保向方法添加装饰器来解决这个问题,以便在编译时正确地发出tsc,但这也是您所能做的全部

相关问题