关于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