TypeError: Super expression must either be null or a function

使用3d 1.1报错,论坛里,官方文档都看了,说是装饰器的原因,我把装饰器去掉还是不行,现在项目卡在这里,无法运行,跪求各位路过的大佬帮忙解答,
贴上报错及相关脚本





在线等。。。急:3::3::3:

一般是因为 BaseUI 和这个文件循环引用了

哪里循环引用了?子类只是引用了父类,父类里面也没用到子类的东西

可以复现的工程发一下?

遇见同样的问题 我也是和你一样写了一个UIBase基类 本来没什么问题 就突然出现循环引用

同样的,加了一层继承,然后就不行了

为啥这个帖子没回复了??这个问题咋解决???

找到循环引用然后解决啊

本人目前遇到两次这样的问题:但是最终都解决了
第一次:查到官方大大发的解决方案说是装饰器硬依赖的原因,正好我之前BaseUI里面写了个@property({type: XXX})
果断删除这个,改用初始化查找节点赋值或者其他的方法,无果…在经过一番查找,又在UIMgr中找到同时import BaseUI和他的子类,把该子类使用baseUI作为类型,删除子类的import,在运行,成功…
第二次:继这之后第二个项目很顺利没有这个问题出现(使用的同一套代码),但是在第三个项目上又出现了这个问题,而且还没有正确的堆栈提示,因为有之前的教训,在开发第二第三项目添加修改的代码都避免了上述两个问题,但是还是出现了,原因是之前的代码还是有问题,又是一番查找,这次不是这个BaseUI,是另一个Base脚本,广告基类,
我在其中定义的变量都是使用static,子类就需要使用类名引用,我去除static改为this引用,在抱着试一试的心态运行,成功…
希望本人爬坑的经历可以让部分人得到快速解脱,因为我知道一个人爬坑真的很辛苦
解决方案描述:
修复组件对象构造失败可能导致的场景数据丢失问题:这个问题在论坛中有不少开发者遇到过,我们之前一直未能重现,感谢(@oʍɯʎuǝɥɔ)提供的测试项目帮助我们找到了问题的根本原因。这个问题的根本原因仍然是循环依赖导致的脚本丢失,不过丢失的不是组件脚本,而是组件构造函数依赖的脚本,导致组件实例化失败,而我们没有处理这个错误进而损坏了场景数据,如果用户保存了错误的数据,就会导致场景再也无法打开。这个严重的问题相信在 v1.0.4 之后就会大幅度减少,而循环依赖的问题我们也计划在 v1.1 中继续优化。Cocos Creator 3D 目前比较容易出现循环依赖的主要原因是因为@property({type: XXX}) 这种装饰器写法会在解释脚本阶段立即执行,最终在脚本导入阶段变成了硬依赖,就使得这种类型声明变成了循环依赖的罪魁祸首。我们会尽力在 v1.1 找到更完善的解决方案。

1赞

是我见过对这种循环依赖理解最透彻的同学了。1.1.2我们有稍微优化一般循环引用的检测,如果有循环引用,会报出来。

至于装饰器带来的依赖问题,我们也在苦苦解决,目前的一种方法是用 cc 名字代替 类型。

@ccclass("C")
class MyC {
}

class D {
   @property("C")  用 `MyC` 的 cc 类名 "C"
   c: MyC | null = null; // `MyC` 当类型用不会带来实际引用
}

但是我们还是非常不愿意让用户写字符串的,因为没智能提示

我们甚至还试想过一种“特别”的方法,允许将传递给装饰器 property 的类型延后:

@defered(() => MyC) // 或者是: `@defered(function () { return MyC; })`,在导入阶段完成时候,再去获取类型
c: MyC | null = null;

或者:

@property(/** #__deferred__ */ MyC) // 当我们在语法层面解析到该注释,把该句转换为上面那种形式
c: MyC | null = null;

:slight_smile:

今日,又不小心写入一个循环引用:
在接入视频广告后,运营后来又在后台创建了banner广告位,需要在部分界面打开时显示,
因为UI使用了BaseUI基类,想当然的在基类里面open的时候通过判断uitype来显示banner
等到打包运行,又出现了红色报错,当时一看到这个报错都惊呆了。。。以为自己经历了之前两次,能够完全避免这个问题(回想起第一次被循环引用支配的恐惧…真的是痛不欲生),
有了以前的经验,这次找的很快,解决了,但是觉得还是记录一下,好让小白们能多些参考(大佬遇到问题都是直接去改底层了)
首先问题是:在子类和基类同时import同一个类(这个类是我的广告管理类)出现了循环引用(这好像不叫循环引用,重复引用?),解决办法,把在BaseUI里面写的显示banner代码写在每个需要的子类里面,去掉BaseUI里的广告管理类引用即可

代码:
基类
1:


2:

3:

子类

1赞