打字稿无法从打字稿装饰器访问属性类型。 (目标是:{})

时间:2019-03-30 17:31:13

标签: typescript vue.js typescript-decorator reflect-metadata

我目前正在实现一个依赖注入器,以在VUE js项目中使用。

我创建了一个Inject装饰器,我希望能够访问属性类型,我昨天使它工作了,但是发生了一些事情,我完全迷失了。我已经控制台注销了JSON.stringify(target),并且收到了一个空对象,这意味着在构造类之前要运行我的装饰器。

我正在使用反射元数据来获取类型,但是由于目标是空对象,因此它解析为null。可以通过将类型作为装饰器参数来解决此问题,但是该解决方案并不如我所愿。

是否有一种方法可以让装饰器等到类构造好之后,或者在某个地方我完全错了?装饰器代码如下:

export const Inject = (): any => {
    return (target: any, key: string): any => {
        if (delete target[key]) {
            Object.defineProperty(target, key, {
                get: () => {
                    const type = Reflect.getMetadata('design:type', target, key);
                    return Injector.resolve(type);
                },
            });
        }
    };
};

装饰器注释如下:

@Inject()
public testService: TestService;

谢谢!

1 个答案:

答案 0 :(得分:1)

所以,经过几天的混乱,我终于找到了一个答案,为什么它不起作用,这使我感到困惑,因为它是如此的令人眼花obvious乱。因此,在TS配置文件中,需要将一个标志设置为true才能发出装饰器元数据。该标志如下所示:

"emitDecoratorMetadata": true

设置完成后,代码将像以前一样工作!