【问题标题】:refect-metadata "design:type" circular dependency反射元数据“设计:类型”循环依赖
【发布时间】:2021-12-04 01:44:08
【问题描述】:

this repo 中,您可以清楚地看到这两个类在属性上都有元数据设计:类型。但是,当我尝试探查时,其中只有一个会显示出来。谁能解释一下?

【问题讨论】:

    标签: typescript reflect-metadata


    【解决方案1】:

    如此处所述https://github.com/rbuckton/reflect-metadata/issues/135#issuecomment-985998206:

    这是 Typescript 发出的元数据格式的已知限制。较新的元数据系统使用“解析器”模式来解决这个问题——例如,它不会在元数据中使用 SomeClass 引用,而是使用 () => SomeClass 并期望检索元数据的代码执行获取类的函数(构造函数)参考。

    根本原因是,在循环依赖的情况下,内部所需文件在外部文件中导入它的位置处完全执行。导入发生后声明的代码尚未运行。 CommonJS 和 ES 模块都是如此,但是在 ES 模块中,您为导入指定的名称绑定到从导入文件导出的等效名称——也就是说它是“活的”——所以在两个文件都被满载的值是正确的。这就是“解析器”模式起作用的原因。

    如果不重新安排代码,解决这个问题可能会很痛苦,甚至是不可能的。一些像 TypeORM 这样的库直接使用解析器模式来允许循环依赖,同时仍然使用标准的 Typescript 元数据发射。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-29
      • 2016-11-09
      • 2015-11-19
      • 2018-07-17
      • 2011-12-01
      • 2020-10-27
      • 2020-09-25
      • 1970-01-01
      相关资源
      最近更新 更多