TypeScript装饰器,获取构造函数参数类型和注入

时间:2017-04-18 12:02:25

标签: typescript decorator ecmascript-7

假设您有一个这样的类,并附加了Router装饰器。

@Router
class AuthRouter {

    constructor(private cacheService: CacheService) {}
}

如何从Router装饰器中获取构造函数参数类型?假设我们已经存储了一个CacheService单例,如果我们知道了类名" CacheService"我就可以访问它们。

function Router(target) {

    // somehow get the constructor class name
    const dependencyNames = 'CacheService' // an array if multiple args in constructor

    // getSingleton is a function that will retrieve
    // a singleton of the requested class / object
    return new target(getSingleton(dependencyNames))
}

因此,无论何时我们使用AuthRouter,都会将CacheService注入其中。

1 个答案:

答案 0 :(得分:2)

import 'reflect-metadata'

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

请注意,您正在调用没有第三个参数的getMetadata。 types将是构造函数参数的数组。 types[0].name === 'CacheService'