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