gpt4 book ai didi

javascript - TypeScript 装饰器和循环依赖

转载 作者:搜寻专家 更新时间:2023-10-30 21:24:24 24 4
gpt4 key购买 nike

考虑使用装饰器的相互依赖代码示例(如下)。

现在考虑以下工作流(是的,我确实想传递实际导出的类,因为我以后需要使用它们):

  1. App 导入并运行 Parent.ts
  2. @Test(Child) 导致应用在装饰时导入 Child.ts
  3. 注意:代码尚未到达类Parent
  4. Child.ts中,执行了@Test(Parent)装饰器
  5. 此时,Parent 未定义,无法传递给装饰器。

如您所见,存在令人讨厌的循环依赖,我看不出有什么方法可以应用将类作为相互引用的参数的装饰器。

请注意,为了简洁起见,我使用了 @Test 作为示例。实际的装饰器是 @HasMany@BelongsTo - 所以我在这里有一个实际的用例。

我的问题是:“这个问题有解决方案吗?”

我担心没有,除非更改 TypeScript 的编译代码以推迟装饰过程,直到所有相关代码都被导入。

代码示例:

Decorators.ts:

    export function Test(passedClass: Function): Function {
return function (model: Function): void {
console.log(typeof passedClass);
};
}

Parent.ts:

    import {Child} from "./Child";
import {Test} from "./Decorators";

@Test(Child)
export class Parent {

}

Child.ts:

    import {Parent} from "./Parent";
import {Test} from "./Decorators";

@Test(Parent)
export class Child {

}

最佳答案

今天遇到同样的问题。我通过用 @Test(() => Parent) 替换 @Test(Parent) 来稍微不同地解决它。

我没有跟踪元数据中的类构造函数 (Parent),而是跟踪返回构造函数的 thunk (() => Parent)。这会延迟对 Parent 导入变量的评估,直到调用 thunk,这就达到了目的。

关于javascript - TypeScript 装饰器和循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39334698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com