TS的类互相引用了怎么解决?

新手开发,TS的类互相引用,即A里面 import B from B,B里面 import A from A。
这种问题大家怎么解决的?

@IOXBruin
看demo

// ==== 文件 TestA.ts ====
import TestB from "./TestB";  // 互相impot

export default class TestA {
    b: TestB;

    constructor(refB: TestB) {
        this.b = refB;
        refB.a = this
    }
}

// === 文件 TestB.ts ===
import TestA from "./TestA";   // 互相impot

export default class TestB {
    a: TestA;
}

// === 文件 main.ts ===
import TestA from "./TestA";
import TestB from "./TestB";

let b = new TestB();
let a = new TestA(b);

console.log(a);

// === 命令行执行 ===
ts-node .\main.ts

// === 执行结果 ===
TestA { b: TestB { a: [Circular] } }

我想知道你说的问题是什么, 需要解决什么?

1赞

@IOXBruin
A, B 互相包含, 是有坏的味道在里面, 但既然你是新手, 就先别考虑这么多. 能把界面搭出来, 游戏逻辑能跑起来就不错了.

等你想避免互相包含, 就去学java, 去学设计模式.

https://www.yuque.com/fengyong/game-develop-road/lg3g7l
在ts中,import语句是没有循环引用问题的,因为import输出的是一个值的引用,只有在具体使用时才会去取值,在这篇文章中有更具体的描述http://es6.ruanyifeng.com/#docs/module-loader#ES6-模块与-CommonJS-模块的差异。
但是通过@property()定义的属性,是直接通过编辑器初始化的,相当于直接使用了,则会造成循环引用的问题。

目前的解决方案就是在@property()中传入一个cc.Node,然后在onLoad()时获取对应的组件。

2赞

使用接口

1赞

感谢楼上各位大神的回复,应该解决了

使用什么接口?应该怎么写?

但是 B 继承 A就有问题了

确实,可以参考这篇文章,并不是ts的import可以解决循环引用https://blog.csdn.net/tkokof1/article/details/108984865

image
image

这么老的帖子了,
不过,不直接引用,加一个interface 不就解决了么。

大佬,interface要加在哪里呀?

// testA 中
interface ITestA {
setLabel(str: string): void;
}

加一个方法
initTestA(testa) {
this.testa = testa;
}

好的,多谢大佬解答