新手开发,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


这么老的帖子了,
不过,不直接引用,加一个interface 不就解决了么。
大佬,interface要加在哪里呀?
// testA 中
interface ITestA {
setLabel(str: string): void;
}
加一个方法
initTestA(testa) {
this.testa = testa;
}
好的,多谢大佬解答