3.8.2升级到3.8.3后,啪啪报错,就因为3.8.3多了一个“_”

  • Creator 版本:

  • 目标平台:

  • 重现方式:

  • 首个报错:

  • 之前哪个版本是正常的:

  • 手机型号:

  • 手机浏览器:

  • 编辑器操作系统:

  • 重现概率:

360截图20240517155856
将cc中 namespace __private的_types_globals__Constructor增加一个"_"前缀的意义在哪里?

难道就为了让开发者重新替换一遍吗?

3.8.2升级到3.8.3后,啪啪报错,就因为3.8.3多了一个“_”
所有用到_types_globals__Constructor的类型都要改为__types_globals__Constructor

可不可以这样 __private._types_globals__Constructor=__private.__types_globals__Constructor

您好,声明文件 cc.d.ts 中 __private. 开头的类型是引擎私有类型,并不对外暴露的,其是按照目录拼接的路径,我们可能会对 __private 下的类型做一些调整。

请问,您碰到这个报错,是因为在项目代码中直接使用了 __private.types_globals_Constructor 了吗?
还是其他情况?

自己代码不规范导致的问题,人家用__private就是引擎内部不给外面用的。
你在外面引用得越多,说明你的代码逻辑越混乱

1赞

__private._cocos_2d_assembler_graphics_types__LineCap
那你说吧,这个枚举你怎么定义类型。

简直胡扯,__private就是cc导出的命名空间,到你这里成了不给外面用了?

人家官方都说不对外暴露了,怎么还在这里嘴硬啊

看到这个命名就知道应该不是给外部使用的啊

这种情况一律使用 typeof 就可以了:

export function setLineCap(graph: GraphicsComponent, lineCap: typeof graph.lineCap) {
    graph.lineCap = lineCap;
}

如果你想显示地声明这个类型,也可以用这种写法:

type GetPropType<T, P extends keyof T> = {
    [K in keyof T]: T[K]
}[P];

type TypeOfLineCap = GetPropType<GraphicsComponent, "lineCap">;

export function setLineCap(graph: GraphicsComponent, lineCap: TypeOfLineCap) {
    graph.lineCap = lineCap;
}
1赞

又是下划线又是private,怎么看都不是让你用的。像楼上老哥说的是typeof就可以了。

export namespace __private
最好能把cc.d.ts中私有的类型去掉export

这个应该暂时去不掉,因为的确有的 public 的接口的参数会依赖没有导出的类型。

理论上,所有 public 的接口,都应该依赖非 private 的类型。

可以考虑自己声明一个类型一致的类型来用吧。
比如我要用
__private._cocos_asset_asset_manager_downloader__DownloadHandler
,就声明
type DownloadHandler = (url: string, options: Record<string, any>, onComplete: ((err: Error | null, data?: any | null) => void)) => void;
然后去用。如果之前声明的类型和新版本不一致 传参时会提示的

感谢提供的解决方案,比较通用,后续能解决很多类似的类型提示问题。

虽然麻烦,可能也只能这样了,目前没有想到更好的办法。
如果__private._cocos_asset_asset_manager_downloader__DownloadHandler后期更新版本有变动,还是要自己去手动修改的,且如果__private中某个接口多级嵌套和引用,自己再自定义就挺麻烦也损失了可读性。

typeof必须获取实例才能使用的,很多时候是在实例前使用,如
__private.__types_globals__Constructor

举个实际的代码例子