等到静态变量在构造函数中完成初始化

时间:2016-02-09 09:12:55

标签: static typescript

如果我有类似以下的课程:

export class ClassA{
    static Alpha: string;
    static Beta: string[];

    constructor(jsonData: any){
        ClassA.Alpha = jsonData.alpha;
        ClassA.Beta = new Array<string>();
        for(let i=0; i<jsonData.betaList.length; i++){
            ClassA.Beta.push(jsonData.betaList[i]);
        }
        //do whatever it takes that takes a really long time
    }
}

export function foo(list: string[]){
    //something
}

当我编写如下代码时:

let dat = //whatever to parse a certain json file
new ClassA(dat);
foo(ClassA.Beta);

我想确保ClassA.Beta的初始化在调用foo()之前完成。可能吗?还是Typescript会自动处理这种情况吗?

1 个答案:

答案 0 :(得分:3)

您可以确定在ClassA构造函数完成后将执行foo()。除非它使用任何类型的异步调用(Promises,setTimeout等)。

话虽如此,我认为目前的设计不是最好的设计。您是否真的想在每次调用构造函数时初始化类静态属性?

更好的方法是将单独的静态初始化逻辑放入Init()静态方法,并在应用程序的适当位置调用它:

export class ClassA{
    static Alpha: string;
    static Beta: string[];

    public static Init(jsonData: any): void
    {
        ClassA.Alpha = jsonData.alpha;
        ClassA.Beta = new Array<string>();
        for(let i=0; i<jsonData.betaList.length; i++)
        {
            ClassA.Beta.push(jsonData.betaList[i]);
        }

        //do whatever it takes that takes a really long time
    }

    constructor()
    {
        //Initialize instance members here. Not static
    }
}

export function foo(list: string[])
{
    //something
}

let dat = {};//whatever to parse a certain json file
ClassA.Init(dat);
foo(ClassA.Beta);

这种方法将允许您稍后使Init()返回Promise,以便在需要时使代码异步。