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名称进行RegExping
target.toString()
,然后执行单例注入看看,它们会执行类似的操作,但我不确定这是否适用于构造函数。但是你似乎忽略了类装饰的意义。它不应该返回类的实例,如果返回,那么它一定是一个构造函数。@NitzanTomer我知道,我只是在摆弄装饰器来了解它们是如何工作的。我想知道
Angular
是如何在内部实现这一点的。返回一个新的构造函数仅仅是
装饰器的一个设计原则,还是会有“负面”的副作用?@jevgenig我希望通过使用
反射元数据
库可以实现这一点。我不确定我是否理解你的要求。您可以选择不从decorator函数返回任何内容,但如果返回,则需要是构造函数。什么副作用?
import 'reflect-metadata'

function Router(target) {
    const types = Reflect.getMetadata('design:paramtypes', target);
    // return a modified constructor
}