循环引用报错,TypeError: Class extends value undefined is not a constructor or null

引擎版本3.8.2,会莫名其妙的报循环引用的错误。有人遇到过吗?
举例说一下:一个Class在某一个文件中作为导出全局对象的类型,类似:image 并在本文件中完成实例化。然后又有一部分class继承自它,比如:image

然后再在另一个工厂类中创建该类型的实例,如下:image 然后再在随便其他地方调用这个getClassInstance方法,注释部分如果放开就会在编辑器中报循环引用的错误:image ,请问这是引擎bug吗?还是其他什么问题,有大佬能告知吗?

@boyue

大佬能帮忙看一下嘛 :mask:

别@jare ,他已不在cocos官方了,离职了

看看你的BaseConfigManager.ts中引入了哪些类

image 。CfgMgr里面会调用CreateFactor-getClassInstance

如果你在 A类 需要引用 B类;而 B类 又恰好引用了 A类。那么就出现了循环引用的情况。代码没看到你的循环引用,需要你自己找找了,但是应该不是引擎问题

做过最小化实验,是没有问题的,AB两个最简单的Class互相引用没有任何问题,这种互相引用的情况在项目开发中也经常会遇到,比如列表和item之间。但不知道为何这边这个我都把成员和方法都删了也会报错

列表和item 怎么会相互引用呢,列表脚本可以引用item类,难道你的item类还引入列表类啊。我一般不这么处理,要么就通过传callback到item,要么通过事件订阅发布那种模式传到列表脚本 。或者通过一个中间者,一个数据管理类,管理item和list,不会出现循环引用

不只是列表的可能性,这种问题挺不好重现的,我自己的试验是有的时候就可以互相引用有的时候就莫名其妙报错,逻辑都是一样的

解决了吗?我也出现这种问题了

最好是解偶吧,要不然太麻烦了,就像我一个UI管理器里面要去管理UI,但是UI基类又要调用UI管理器去关闭自己,这时候就只能作回调或者事件了

使用延迟导入,await import模块,配合文件头部import type可以解决,找一个地方做这个事,当中转站,它不导入任何东西,只导type

刚刚解决了。我的情况是两个子类实现父类的方法,两个子类的方法一模一样,其中一个子类实例化的时候出现这种报错,另一个子类实例化完全没有问题。我把子类和父类都放在一个文件里就没报错了

主要还是一个形成闭环的问题,cocos这边自己能解决部分环,有的时候没啥问题,但你不知道啥时候它解决不了,在这个闭环上哪个节点就报错了,最根本的解决办法还是找一个没有任何导入或者只导入type的地方导出全局变量,可以用插件检查每个ts文件的循环引用数。

上一秒还是编译好的,下一秒编译就出这样的错了。。。

按我说的去弄就可以完美解决,我这边是已经OK了