关于ccc3.x的ts编译问题

我在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;

assets.zip (729 字节)
demo代码

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;

您说的这个方法在3.6之前是可以的,3.7之后就不行了。楼下说的declare 修饰词在3.7之后是可以的

我试了下,还真是,我觉得这是个 bug,! 就已经表示了用户声明有值不需要编译器赋值为 undefined

好难受,3.8至今没修复这个编译BUG

@minggo @dumganhar 大大们,麻烦看看,修复一波编辑器,每次写 declare 就太麻烦了。
在继承的子类上,也同样声明一次,就会有这个问题

这个不是bug啊, ts -> js 就是这样的规则啊。
你可以在

https://www.typescriptlang.org/play/

中写一些测试代码验证,把 target 设置为 ES5。

这个我确认一下。

但是设置了declare就没问题,declare和 !: 不是等效的吗?

我去试了一下,您给的网站是没问题的。但是在3.8版本上不行,3.6之前的是可以的

了解,这个我后续定位一下,估计 babel 对这块的处理跟 ts compiler 哪里有区别。

也有可能是 3.6 -> 3.8 , babel 版本不一样的关系,我会建个 issue 跟进。

感谢反馈,计划在 3.8.6 中跟进一下