问题标签 [reflect-metadata]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
490 浏览

typescript - Typescript 无法从 typescript 装饰器访问属性类型。(目标是:{})

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

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

我正在使用反射元数据来获取类型,但它解析为 null,因为目标是空对象。可以通过将类型作为装饰器参数传递来解决此问题,但是该解决方案并不像我想要的那样优雅。

有没有办法让装饰器等到类已经构建或者在某个地方我完全错了?装饰器代码如下:

装饰器注释如下:

提前致谢!

0 投票
1 回答
281 浏览

node.js - 加载器异常/装饰器的循环引用

问题

我得到一个循环加载程序异常。这可能是编译器选项造成的"emitDecoratorMetadata":true。我该如何解决?感谢您提供有用的回放!

介绍

我已经准备了一个最小的项目来重现错误。请查看我的临时 git 存储库:git repo for bug presentation

我使用两个库(typeormjson2typescript)并且都使用装饰器进行操作。我在某些类属性上使用了两个库中的多个装饰器。

复制步骤:

  1. 克隆 git 存储库。
  2. 通过命令npm i(npm 6.9.0)安装所有包。
  3. 通过 . 打开根目录Visual Studio Code
  4. 打开bugexample/test/test.spec.ts,进入调试视图,通过配置开始调试Mocha current file

在这些步骤之后,您应该会看到异常输出。

该属性banana将类型Banana作为参数获取,此类型undefined的原因未知。图书馆json2typescript不是这个问题的原因。


分析

现在我想分解这个问题。我从两个模型类开始,以测试结束。

首先,请看一下bug_presentation/src/persistence/models/ape.model.ts

在第 24 行中,类型Banana是传递的参数,但由于未知原因,它目前undefined用于当前测试。

现在请看一下bug_presentation/src/persistence/models/banana.model.ts

第 21 行和第 22 行有问题。如果我将这些行注释掉,则没有加载程序异常。

最后请看一下bug_presentation/test/test.spec.ts

我想测试类型/类Banana是否未定义,但测试会提前中断,因为如果传递的属性(在本例中为 type )库json2typescript会引发异常。Bananaundefined

奇怪的行为是,如果我将类分配Ape给一个变量(删除第 6 行的注释),那么类型/类Banana就被定义了。


0 投票
2 回答
1267 浏览

node.js - 无法在生产服务器中的 Docker 容器上模块“反射元数据”

我收到一个错误

在生产服务器上运行 docker-compose 时。虽然我已经在本地机器上成功运行了,但是我真的很难理解为什么生产服务器会出现这个错误?

我的 package.json:
{ ... "dependencies": { "@types/mocha": "2.2.41", "@types/node": "7.0.22", "@types/express": "^4.16.0", ... "nodemon": "latest", "puppeteer": "latest", "reflect-metadata": "latest", "typeorm": "0.2.16", "typescript": "latest" }, ... }

我的 Dockerfile:

我的 docker-compose.yml:

0 投票
0 回答
875 浏览

typescript - vue-property-decorator @Prop 验证器通过反射元数据在刷新页面后不起作用

正如标题一样,通过反射元数据的@Prop 验证器在刷新页面后不起作用。

正如文档所说,我导入reflect-metadataemitDecoratorMetadata转向true.

我的代码是这样的:

当我第一次进入页面时,它肯定会起作用。但是当我刷新页面时,它不起作用(它不验证 prop 的类型,包括 dev env 和 prod env)。而且我确定我只导入reflect-metadata一次,并且我已经更新reflect-metadata到最新版本 0.1.13(因为我听说旧版本有一些“意外行为”)。

我尝试导入reflect-metadata依赖项(抱歉修改了依赖项的代码),这一次它可以工作,即使在刷新后也是如此。为什么?

而且我发现了一些奇怪的东西......刷新页面后,该Reflect.getMetadata功能会消失。这有什么问题Reflect吗?

0 投票
0 回答
630 浏览

node.js - 使用自定义 ClassDecorator 在类实例中注入依赖项

我正在为 NestJS 编写一个模块,我想在其中自定义ClassDecorator

  • 上课@Injectable
  • 在类实例中注入依赖项

这是几行代码,说明了我的期望:

我在谷歌上搜索了很多关于如何实现自定义装饰器的参考资料,我认为我对此很满意。我也开始阅读一些文档,reflect-metadata因为我认为反射可以帮助我实现这一目标。

下一步是定义一个方法装饰器,它可以访问AppService注入的实例MyClassDecorator

例如,假设它AppService被实现为EventEmitter

你对我应该如何实现这样的装饰器有什么建议吗?任何帮助/示例/参考将不胜感激。最后,不要犹豫,询问更多细节或解释我想要实现的目标。

感谢您阅读我,祝您有美好的一天!

0 投票
0 回答
612 浏览

javascript - TypeError Reflect.defineMetadata 不是函数,纯TS项目

我一直在尝试使用反射元数据保存一些关于方法+类的元数据,类似于这个包。

我同时使用 TypescriptexperimentalDecoratorsemitDecoratorMetadata设置为 true。我已经reflect-metadata通过 npm 安装并在顶部导入它。我还可以访问类型,并且可以查看有关方法的详细信息Reflect.defineMetadata()

tsc编译良好,没有任何错误,但在运行时我总是打:

此外,当使用导入时reflect-metadataimport 'core-js/es7/reflect';.defineMetadata 确实不是类型下可用的功能,似乎只有 defineProperty 是一个东西。

我的代码的完整上下文可以在这里找到。

0 投票
1 回答
305 浏览

typescript - 打字稿装饰器:从方法装饰器中获取类装饰器值

我有一个类装饰器(fooAnnotation)和方法装饰器(barDecorator)。

我的需要是 barAnnotation 必须使用 fooAnnotation 的值,但不幸的是 typescript 在方法装饰器之后评估类装饰器,因此在 barAnnotation 内部尚未定义 fooAnnotationMetadata。

方法装饰器如何检索类装饰器的值?

0 投票
1 回答
3771 浏览

javascript - 无法将依赖注入派生类

我有一个相对简单的设置,包含三个类。我正在使用inversify依赖注入。但是当将类MessageBroker注入派生类时Repository,它MessageBroker是未定义的:

你可以自己试试。我创建了一个小型 GitHub 存储库:https ://github.com/flulude/stackoverflow-inversify-injected-service-undefined

运行脚本时,我收到此错误:

PS 在将代码编译为 Javascript 时,我得到了几乎相同的错误

0 投票
0 回答
90 浏览

typescript - 如何获取类中的所有属性,该类继承自基类,并带有某种装饰

我正在尝试获取所有用某些装饰器装饰的属性。我正在尝试使用reflect metadata它,但是如果类继承自另一个也具有修饰属性的类,则它不能正常工作。

问题是装饰器方法中的目标始终是基类。这意味着当提取数据时,Reflect.getMetadata它会带出所有属性,而不仅仅是特定类。

此 Stackblitz的较低屏幕截图显示了问题。

截图

0 投票
1 回答
81 浏览

angular - 反射元数据:检查属性是否具有“输出()”装饰器

我正在编写一个 Angular 库。一个对象包装了一个 Angular 组件实例,这个对象必须订阅组件实例中所有标有Output装饰器的主体。到目前为止,这是我在构造函数中编写的代码:

Reflect.getMetadata正在返回 false 还分析角度组件内的属性“testEvent”:

我究竟做错了什么?

更新

目前,我使用了这个技巧:

非常丑陋,但它的工作原理