TypeScript: как вызвать функцию stati c внутри класса без конструктора? - PullRequest
2 голосов
/ 08 мая 2020

У меня есть класс, назовем его CoolClass, который я использую во всем своем коде для доступа к его свойствам c stati. Однако у меня есть этап настройки в CoolClass, который я определяю как функцию как часть моего класса; назовем его doSetupStuff(). Чтобы заставить это сработать, я вызываю его, установив переменную stati c dummy.

Это мое текущее решение, которое работает:

export default class CoolClass {
    public static readonly something = 'cool';
    public static readonly somethingelse = 12345;

    // GOAL: how can we call doSomeStuff() only once, without setting this 'dummy' variable?
    public static readonly dummy = CoolClass.doSetupStuff();

    public static doSetupStuff(): void {
        console.log('doing setup...');
        // more logic here...
    }
}

Но мне это кажется неправильным потому что мне никогда не нужно CoolClass.dummy - мне просто нужно запустить то, что находится в doSetupStuff().

Я знаю, что могу это сделать:

export default class CoolClass {
    public static readonly something = 'cool';
    public static readonly somethingelse = 12345;

    constructor() {
        this.doSetupStuff();
    }

    public doSetupStuff(): void {
        console.log('doing setup...');
        // more logic here...
    }
}

, но тогда я не могу использовать CoolClass статически. (т.е. мне нужно вызывать new каждый раз, когда я хочу использовать его в других частях моего кода).

Конечно, нет необходимости устанавливать переменную dummy, как в моем текущем решении. Есть у кого-нибудь идеи? При необходимости я могу опубликовать полный код, хотя я считаю, что это не имеет отношения к шаблону, который я хочу достичь sh.

1 Ответ

4 голосов
/ 08 мая 2020

Думаю, я бы, вероятно, объявил это, настроил, а затем экспортировал

class CoolClass {
    public static readonly something = 'cool';
    public static readonly somethingelse = 12345;

    public static doSetupStuff(): void {
        console.log('yay!');
    }
}
CoolClass.doSetupStuff();
export default CoolClass;

Тем не менее, наличие doSetupStuff be publi c, вероятно, далеко не идеально, если оно не предназначено для вызывается пользователями класса. Вы могли бы скрыть эту функцию, если бы она работала только с publi c аспектами класса:

class CoolClass {
    public static readonly something = 'cool';
    public static readonly somethingelse = 12345;
}
function doSetupStuff(): void {
    console.log('yay!');
}
doSetupStuff();
export default CoolClass;

Тем не менее, вместо этого меня соблазнит синглтон:

class CoolClass {
    public readonly something = 'cool';
    public readonly somethingelse = 12345;

    constructor() {
        console.log('yay!'); // Setup here...
    }
}
export default new CoolClass();
...