Typescript 类型脚本修饰符,获取构造函数参数类型和注入
假设您有一个类似这样的类,它附带了Typescript 类型脚本修饰符,获取构造函数参数类型和注入,typescript,decorator,ecmascript-2016,Typescript,Decorator,Ecmascript 2016,假设您有一个类似这样的类,它附带了路由器装饰器 @Router class AuthRouter { constructor(private cacheService: CacheService) {} } 如何从Routerdecorator中获取构造函数参数类型?假设我们已经存储了一个CacheService单例,如果我们知道类名“CacheService”,就可以访问它 因此,无论何时我们使用AuthRouter,它都将有CacheService注入其中 import 'ref
路由器装饰器
@Router
class AuthRouter {
constructor(private cacheService: CacheService) {}
}
如何从Router
decorator中获取构造函数参数类型?假设我们已经存储了一个CacheService
单例,如果我们知道类名“CacheService”,就可以访问它
因此,无论何时我们使用AuthRouter
,它都将有CacheService
注入其中
import 'reflect-metadata'
function Router(target) {
const types = Reflect.getMetadata('design:paramtypes', target);
// return a modified constructor
}
请注意,您在调用getMetadata时没有第三个参数<代码>类型
将是构造函数参数的数组<代码>类型[0]。在您的情况下,name=='CacheService'
。这将适用于其他语言,如使用反射的C#,它允许在运行时访问所有类型。但打字脚本是不同的。它不在运行时中包含类型信息,因此在运行时不能使用类型。您可以尝试的解决方案是对args名称进行RegExpingtarget.toString()
,然后执行单例注入看看,它们会执行类似的操作,但我不确定这是否适用于构造函数。但是你似乎忽略了类装饰的意义。它不应该返回类的实例,如果返回,那么它一定是一个构造函数。@NitzanTomer我知道,我只是在摆弄装饰器来了解它们是如何工作的。我想知道Angular
是如何在内部实现这一点的。返回一个新的构造函数仅仅是装饰器的一个设计原则,还是会有“负面”的副作用?@jevgenig我希望通过使用反射元数据库可以实现这一点。我不确定我是否理解你的要求。您可以选择不从decorator函数返回任何内容,但如果返回,则需要是构造函数。什么副作用?
import 'reflect-metadata'
function Router(target) {
const types = Reflect.getMetadata('design:paramtypes', target);
// return a modified constructor
}