声明与某些基类属性同名的属性

时间:2016-07-04 20:21:04

标签: typescript

我正在扩展一个模块,我注意到当我声明一些私有属性时,例如方法init(),会发生以下错误:

  

类型具有私有属性'init'

的单独声明

我知道造成这种情况的原因是我在超类中有一个相同的方法,但是我不想仅仅因为那个已经在类中被调用而调用不同的名称我甚至无法将其作为私人访问!

我将该方法声明为私有,完全是为了避免这种情况。我不想覆盖它,但这不应该阻止我在另一个类中再次声明它。无论如何,有什么意义呢?

1 个答案:

答案 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));

code in playground

正如您所看到的,method原型中的B正在被新功能覆盖,因此实际上控制台会显示"B"。 这是受保护而非私有的行为,可能是因为它不被允许。

我认为你有三个选择:

  • 为私有方法使用不同的名称
  • 将方法从私有更改为受保护,它将完全相同但至少在代码中会清楚这是这种情况
  • 为这两个只使用public / protected方法的类使用基类,然后在这两个类中实现私有方法