我在ts中没有写构造函数呢,js怎么把构造函数写上了,而且还把属性置空了,父类在构造函数里面运行了子类的抽象接口,然后这里又给置空了。
这个编译怎么和tsc的编译不一样呢。上图为ccc编译后的JS文件
我在ts中没有写构造函数呢,js怎么把构造函数写上了,而且还把属性置空了,父类在构造函数里面运行了子类的抽象接口,然后这里又给置空了。
这个编译怎么和tsc的编译不一样呢。上图为ccc编译后的JS文件
unity上的C#和 自己用tsc编译都不会出这样的问题
那你写的ts代码长啥样子呢
修改属性定义的方式, 从
private _ts: number = null;
public tec: number = null;
public error: number = null;
public state: number = null;
改为
private _ts: number;
public tec: number;
public error: number;
public state: number;
import { _decorator } from "cc";
const { ccclass } = _decorator;
@ccclass('absTest')
export abstract class absTest<T> {
constructor(value: T) {
this.Update(value);
}
private _bbb: T;
public get bbb(): T {
return this._bbb;
}
public Update(val: T) {
this._bbb = val;
this.OnUpdate();
}
protected abstract OnUpdate(): void;
}
import { _decorator } from "cc";
import { absTest } from "./absTest";
const { ccclass } = _decorator;
@ccclass('test1')
export class test1 extends absTest<string>{
protected OnUpdate(): void {
this._aaa = "aaaaa";
}
private _aaa;
public log(){
//这里,应该输出 aaaaa,哈哈
console.log(this._aaa,this.bbb);
}
}
在入口处调用 new test1("哈哈").log();
按理来说返回的结果应该是aaaaa,哈哈
,但是实际上却是undefined '哈哈'
这是正确的,因为默认的属性值是在构造结束后赋值,而你的属性类型没有加 ! 导致默认值是 undefined,也就是 undefined 覆盖了你的在父类设置的值
谢谢~原来如此
declare private _aaa: string;
我试了下,还真是,我觉得这是个 bug,! 就已经表示了用户声明有值不需要编译器赋值为 undefined
好难受,3.8至今没修复这个编译BUG
这个我确认一下。
但是设置了declare就没问题,declare和 !: 不是等效的吗?
了解,这个我后续定位一下,估计 babel 对这块的处理跟 ts compiler 哪里有区别。
也有可能是 3.6 -> 3.8 , babel 版本不一样的关系,我会建个 issue 跟进。
感谢反馈,计划在 3.8.6 中跟进一下