cc.d.ts 存在错误, 无法通过 tsc 类型检查

我使用 webstorm 编辑代码, 总是提示 cc.d.ts 中有 20+ 个错误. 自己尝试过几个版本的 tsc 编译也会出现一堆错误.

这原本不影响运行, 直到现在,
我需要用脚本预处理代码, 这个过程会用到 tsc 编译, 由于这个问题, 脚本走不下去.

为什么脚本不用 babel ? 因为我有许多自定义 @装饰器, babel 装饰器逻辑有问题, 我需要用 tsc 预处理自己的代码后再输出到 assets

  • Creator 版本: 3.4.1

  • 重现方式:使用 tsc 4.5.5 (以及其它版本) 编译: tsc -p tsconfig.json 或者 webstorm 右下角 “typescript - Compile”

  • 首个报错: …declarations/cc.d.ts:27710:9 - error TS2416: Property ‘on’ in type ‘SystemEvent’ is not assignable to the same property …

TypeScript: TSConfig Option: skipLibCheck (typescriptlang.org)

官方不认为这是 bug 么? 事实上我目前的 workaround 是在 cc.d.ts 加上 // @ts-nocheck

另外我觉得奇怪, cc 内部为什么不用 tsc 而用 babel ?

Babel 毕竟对 ts 支持并不完备.

比如, 我发现对于重定义 get/set 的 @装饰器, babel 无法在定义属性的时候初始化:

const logged = (target, prop, desc?):any =>
{
	const key = `_$_${prop}`
	return {
		get() { console.log(`@logged: get ${prop} (${this[key]})`); return this[key] },
		set(v) { console.log(`@logged: set ${prop} to ${v}`); this[key] = v},
	}
};

class Hello
{
	@logged x = 123;
}

let h = new Hello();
console.log("x=" + h.x);

结果:

$ npx tsc index.ts --outFile index_tsc.js --experimentalDecorators --target es6 && node index_tsc.js
@logged: set x to 123  # tsc 正常初始化了 x
@logged: get x (123)
x=123 

# ["@babel/plugin-proposal-decorators", {"version": "legacy"}],
$ npx babel --extensions .ts index.ts -o index.js && node index.js
@logged: get x (undefined)
x=undefined # babel 没有执行初始化语句 x = 123