2

我目前正在实现一个在 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;

提前致谢!

4

1 回答 1

2

因此,经过几天的折腾,我终于找到了为什么这不起作用的答案,这让我很伤心,因为它是多么明显。所以在 TS 配置文件中有一个标志需要设置为 true 才能发出装饰器元数据。该标志如下图所示:

"emitDecoratorMetadata": true

设置好后,代码的工作方式与以前完全一样!

于 2019-04-03T11:57:17.323 回答