是否有理由偏爱私有类方法而不是未导出的辅助函数?

时间:2018-10-15 13:52:54

标签: typescript

TypeScript具有私有类成员的概念(即使私有和公共之间的区别不会归结为JavaScript输出)。

this.stemAPI.submitBOLData(this.submitAllData, this.reap.token)
  .subscribe(
    res => { /* Do what you want with this error */ }, 
    err => { /* Error handled here */ }
   );

或者,可以简单地不从模块中导出方法,而将方法从使用者“隐藏”。

// Pattern A

export class Foo {
  constructor() {
    this.doSomething();
  }
  // private method
  private doSomething() {}
}

在所有Typescript代码库中,是否有实际理由偏爱其中一种模式?

2 个答案:

答案 0 :(得分:1)

我认为唯一重要的区别是私有方法可以通过this访问实例变量和方法,而未导出的帮助器函数则不能。无论哪种方式,我都会感到满意。

您已经注意到了这一点,但是为了后代,我想使用private方法指出版本的编译输出:

var Foo = /** @class */ (function () {
    function Foo() {
        this.doSomething();
    }
    // private method
    Foo.prototype.doSomething = function () { };
    return Foo;
}());

Typescript将doSomething分配给Foo原型,这与实现公共方法相同。 “私有”限制仅由Typescript在编译时强制执行。如果将此代码与纯Javascript代码结合使用,则JS代码将能够像调用公共方法一样容易地调用private方法。但是在一个全Typescript项目中没关系。

不使用Typescript时,通常通过在类构造函数中定义私有方法来实现私有方法。这将为每个实例创建一个新的方法副本,该副本将关闭构造函数中的变量,这可能导致更多的内存使用。我认为了解Typescript不遵循该模式很有用。在Typescript中,私有方法与公共方法具有相同的性能特征。

答案 1 :(得分:1)

模式B并非打字稿方式,而是JavaScript方式。

在所有打字稿的代码库中,我肯定更喜欢模式A,因为:

  • 它清楚了开发者的意图
  • 它清楚地指出doSomething属于Foo类,也就是说,它在语义上要好得多。
  • 重构更容易,您只需移动整个类,而不研究要移动的功能。
  • 如果有一天您需要在Foo函数中访问doSomething实例的成员,那么它也将变得更加容易,而不会弄乱.bind()