【问题标题】:TypeScript: how to call a static function internally in a class without a constructor?TypeScript:如何在没有构造函数的类中内部调用静态函数?
【发布时间】:2020-08-24 04:59:59
【问题描述】:

我有一个类,我们称之为CoolClass,我在整个代码中都使用它来访问它的静态属性。但是,我在CoolClass 中有一个设置步骤,我将其定义为我的类的一部分;我们称之为doSetupStuff()。为了让它触发,我通过设置一个静态的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 变量。有人有想法吗?如果需要,我可以发布完整的代码,但我认为这与我希望实现的模式无关。

【问题讨论】:

  • export default class A {...} A.setup();
  • 我想知道一切都是静态的。你确定单例不会更合适吗?

标签: typescript class oop constructor static


【解决方案1】:

我想我可能会声明它,设置它,然后导出它

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 公开可能不太理想,除非它是由该类的用户调用的。如果该功能仅适用于类的公共方面,则可以隐藏该功能:

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();

【讨论】:

  • 没错,但不需要拆分定义和导出。无论如何,在您可以导入该类之前,将对该模块进行评估。虽然你有它可能会更清楚
  • @AluanHaddad - 是的,主要是为了清晰。
  • @T.J.Crowder - 太好了,感谢您的详细回复!最后,我选择了你的第二个例子。导出默认的 new CoolClass() 模式对我不起作用(另外,这是否意味着每当我在其他任何地方导入它时都会创建一个新实例?)。示例 2 对我来说很好,因为正如您所说,这个“设置”步骤不应该公开 - 也不需要公开。
  • @fullStackChris - “导出默认的新 CoolClass() 模式不适合我” 你知道为什么不吗? "(另外,这是否意味着每当我在其他任何地方导入它时都会创建一个新实例?)" 不,只在评估您的模块时创建一次。所有导入都将导入CoolClass相同实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 2011-10-23
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多