typescript - 方法装饰器 - 需要调用装饰器的类模块的完全限定路径
问题描述
当装饰器(方法装饰器)函数执行时,我们可以访问target
,methodName
和descriptor
.
我想知道target
在这种情况下的模块路径。所以基本上是通向称为装饰器的模块的文件路径。我如何获得这些信息?
我尝试使用该module
对象, ie module.parent.filename
,但是使用该对象并不安全,因为当在另一个文件中使用相同的装饰器时它不会更新 - 因此它存储了第一次调用装饰器的文件的信息。
解决方案
你可以使用反射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
,则类装饰器将不会及时为方法装饰器进行评估。
推荐阅读
- c# - .NET Uri:使用构造函数组合路径的意外 Uri
- java - 动态表格行 - 在现有表格行中插入文本视图内容
- c# - 当子元素具有特定文本时如何从 XML 中提取父值
- angular - 如何解决由于提供“@ionic-native/AppVersion”或“.../ngx”而导致的问题,并且在调用 AppVersion 的任何方法时出现异常?
- javascript - 如何在 DOM 中显示来自源映射的 JS 错误
- sql - 如何计算去年的积压
- java - 在spring boot中从类路径资源文件夹的子目录中读取文件
- java - 如何在 Java Swing 中增加 JSeparator 的高度
- r - 如何从数据框中返回 2 个特定行?
- asp.net-core - 在局部视图中调用 ASP.NET Core 视图组件