【发布时间】:2021-12-04 01:44:08
【问题描述】:
在this repo 中,您可以清楚地看到这两个类在属性上都有元数据设计:类型。但是,当我尝试探查时,其中只有一个会显示出来。谁能解释一下?
【问题讨论】:
标签: typescript reflect-metadata
在this repo 中,您可以清楚地看到这两个类在属性上都有元数据设计:类型。但是,当我尝试探查时,其中只有一个会显示出来。谁能解释一下?
【问题讨论】:
标签: typescript reflect-metadata
如此处所述https://github.com/rbuckton/reflect-metadata/issues/135#issuecomment-985998206:
这是 Typescript 发出的元数据格式的已知限制。较新的元数据系统使用“解析器”模式来解决这个问题——例如,它不会在元数据中使用 SomeClass 引用,而是使用 () => SomeClass 并期望检索元数据的代码执行获取类的函数(构造函数)参考。
根本原因是,在循环依赖的情况下,内部所需文件在外部文件中导入它的位置处完全执行。导入发生后声明的代码尚未运行。 CommonJS 和 ES 模块都是如此,但是在 ES 模块中,您为导入指定的名称绑定到从导入文件导出的等效名称——也就是说它是“活的”——所以在两个文件都被满载的值是正确的。这就是“解析器”模式起作用的原因。
如果不重新安排代码,解决这个问题可能会很痛苦,甚至是不可能的。一些像 TypeORM 这样的库直接使用解析器模式来允许循环依赖,同时仍然使用标准的 Typescript 元数据发射。
【讨论】: