是否有理由更喜欢私有类方法而不是非导出的帮助程序函数?



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

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

或者,可以通过简单地不从模块中导出方法来对使用者"隐藏"方法。

//Pattern B
export class Foo {
constructor() {
doSomething();
}
}
// non-exported function in module scope
function doSomething() { }

在全Typescript代码库中,是否有实际理由更喜欢其中一种模式而不是另一种模式?

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

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

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

Typescript 将doSomething分配给Foo原型,这与实现公共方法的方式相同。"私有"限制仅在编译时由 Typescript 强制执行。如果此代码与纯 Javascript 代码结合使用,则 JS 代码将能够像调用公共方法一样轻松地调用私有方法。但是在一个全打字稿项目中,这并不重要。

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

模式B有点不是打字稿的方式,它更像是一种javascript方式。

在全Typescript代码库中,我肯定更喜欢模式A,因为:

  • 它明确了开发人员的意图
  • 它清楚地表明doSomething属于Foo类,即它在语义上要好得多。
  • 重构更容易,你只是移动整个类,而不是研究你也应该移动哪些函数。
  • 如果有一天您需要在函数doSomething访问Foo实例的成员,那也会容易得多,而不会弄乱.bind()

相关内容

最新更新