0

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

4

1 回答 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 回答