3.8.6 isValid返回值类型问题反馈

cc.d.ts的isValid的返回值类型为什么要改成value is T


现在我判断组件无效后,类型直接推断成never了。。
image

去翻了一下引擎的代码对比,发现除了常量改成枚举外代码都没变,那返回值类型为什么要改成never,有官方的人能说下原因吗
图上半:3.8.5, 图下半:3.8.6

去掉!试试?

去掉!当然可以,这里的问题就是isValid返回false后把组件、节点推断成never了,但是我需求就是在判断这个组件、节点失效后做一些处理呢,

手动改cocos的类型提示文件也行,但是未来我是想跟着引擎版本一起升级的(或者换设备的时候),总不能每次都改这个吧

这个 PR 中的改进。

理论上,使用 isValid(value) 判断后,只有在 isValid 返回 true 的情况下,去使用 value 的值,才有意义。否则,返回 false 的话,value 会被自动设置为 never 类型,能够避免误用无效的对象。

这边就是有个使用场景判断组件失效后 打log并从列表中移除、注销事件等处理
as Component能用但是感觉不对劲
image

如果一个组件被 destroy 后,尽管还引用住,但是最终所有的属性都会被置为 null。你这里打印 one.name 没有多大意义吧?

你这个设计明显有问题啊 都没了你还去移除啥?

这里打印name只是个例子哈,我可能用的其他属性,我试过node destory后com的其他属性是还在的,所以有做一些处理,

再比如就算我只是在正式环境下根据节点的名字打log去了解是哪个节点失效了我觉得也是没问题的,

isValid这个方法,不管在之前的使用还是方法名还是源码看来,都是判断节点是否有效,而不是判断节点是否是T类型,

改成value is T的返回值,我总感觉有歧义,原本是什么类型传进来,在!isValid后,就应该原本的类型,而不是判断成never,这是我的理解

然后如果cc.isValid改了,但是node.isValid和component.isValid的返回值却没改,这接口又是没统一,我总感觉不对。。。

这个方法不改的话我以后用com.isValid也行。。。

嗯,没统一的确有问题。

destroy 复位所有属性为null,是异步到下一帧中生效的

代码没问题哈,就是组件失效了才要从列表中移除