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