我正在扩展一个模块,我注意到当我声明一些私有属性时,例如方法init()
,会发生以下错误:
类型具有私有属性'init'
的单独声明
我知道造成这种情况的原因是我在超类中有一个相同的方法,但是我不想仅仅因为那个已经在类中被调用而调用不同的名称我甚至无法将其作为私人访问!
我将该方法声明为私有,完全是为了避免这种情况。我不想覆盖它,但这不应该阻止我在另一个类中再次声明它。无论如何,有什么意义呢?
答案 0 :(得分:5)
我认为其原因是javascript的原型性质 请考虑以下代码
class A {
public constructor() {
this.method();
}
private method() {
console.log("A");
}
}
class B extends A {
private method() {
console.log("B");
}
}
new B();
你期望的是控制台会显示"A"
,因为在类A
的ctor中我们调用了一个私有方法,这意味着它不能被一个类覆盖(为此我们有保护)。
但是这段代码汇编成:
var A = (function () {
function A() {
this.method();
}
A.prototype.method = function () {
console.log("A");
};
return A;
}());
var B = (function (_super) {
__extends(B, _super);
function B() {
_super.apply(this, arguments);
}
B.prototype.method = function () {
console.log("B");
};
return B;
}(A));
正如您所看到的,method
原型中的B
正在被新功能覆盖,因此实际上控制台会显示"B"
。
这是受保护而非私有的行为,可能是因为它不被允许。
我认为你有三个选择: