Typescript生成另一个仅计算一次的静态成员

时间:2016-12-13 13:40:01

标签: typescript

我有一个看起来像这样的课程

class Types {
    static type1 = {name: 'car', isCool: true};
    static type2 = {name: 'house', isCool: false};
    static type3 = {name: 'tree', isCool: true};
}

现在我想获得所有具有该属性的类型' isCool'设为true。 目前,每当我需要它时,我都会在课堂上进行迭代。

我不想每次都重新计算它。此类也将在一个单独的文件中,我将在多个位置导入,我只想计算一次数组。 怎么办呢?

2 个答案:

答案 0 :(得分:1)

您可以计算一次并将其存储,以便不再计算:

class Types {
    private static COOL_NAMES: string[];

    static type1 = { name: 'car', isCool: true };
    static type2 = { name: 'house', isCool: false };
    static type3 = { name: 'tree', isCool: true };

    static getCoolNames(): string[] {
        if (this.COOL_NAMES) {
            return this.COOL_NAMES;
        }

        this.COOL_NAMES = [];

        Object.keys(this).forEach(name => {
            if (this[name].isCool) {
                this.COOL_NAMES.push(name);
            }
        });

        return this.COOL_NAMES;
    }
}

code in playground

答案 1 :(得分:0)

首先,将类型存储在数组中而不是单独的成员似乎更好 - 它会让您的生活更轻松,也更符合逻辑。
其次,您不必使用forEach循环迭代它们,您可以使用filter
最后,您可以将计算存储在成员中,这样您就可以读取它而不是每次都运行计算。

class Types {
    static types = [{name: 'car', isCool: true},
                    {name: 'house', isCool: false},
                    {name: 'tree', isCool: true}];

    public static coolName = this.getCoolNames();

    public static getCoolNames() {
        return this.types.filter((type) => type.isCool);
    }
}