首页 > 解决方案 > 方法装饰器 - 需要调用装饰器的类模块的完全限定路径

问题描述

当装饰器(方法装饰器)函数执行时,我们可以访问target,methodNamedescriptor.

我想知道target在这种情况下的模块路径。所以基本上是通向称为装饰器的模块的文件路径。我如何获得这些信息?

我尝试使用该module对象, ie module.parent.filename,但是使用该对象并不安全,因为当在另一个文件中使用相同的装饰器时它不会更新 - 因此它存储了第一次调用装饰器的文件的信息。

标签: typescript

解决方案


你可以使用反射API 吗?如果是这样,我相信您必须首先将类目标的模块信息作为元数据存储在类装饰器中。然后你可以在你的方法装饰器中检索它。

编辑

我的解决方案最终比我想要的要复杂一些。我忘记了方法装饰器是在类装饰器之前评估的,所以我们需要一个解决方法。

装饰器.ts

import "reflect-metadata";

export function InjectModuleInfo (filename: string) {
    return function <T extends { new (...args: any[]): {} }> (constructor: T) {
        Reflect.defineMetadata("modulePath", filename, constructor);
    }
}

export function MyMethodDecorator (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    console.log(Reflect.getMetadata("modulePath", target.constructor));
}

测试类.ts

import {MyClassDecorator, MyMethodDecorator} from './decorators';

@InjectModuleInfo(__filename)
class BaseClass {}

export class TestClass extends BaseClass {
    @MyMethodDecorator
    public myMethod () {}
}

您想要支持的每个类都需要从一个基类继承,该基类将模块信息作为元数据附加。否则,正如我提到的,如果您将装饰器直接放在 上TestClass,则类装饰器将不会及时为方法装饰器进行评估。


推荐阅读