【问题标题】:'... incorrectly extends base class static side' error when overriding static field in derived class'...在派生类中覆盖静态字段时错误地扩展基类静态端'错误
【发布时间】:2017-02-09 11:38:22
【问题描述】:

在派生类中覆盖静态字段的原因

错误 TS2417:构建:类静态端“typeof TDerived”错误地扩展了基类静态端“typeof TBase”。

这是一个合法的错误案例吗?

class TBase
{
  private static s_field = 'something';

  public constructor() {}
}

class TDerived extends TBase
{
  private static s_field = 'something else'; // commenting this line fixes error

  public constructor()
  {
    super();
  }
}

那我应该如何处理静态字段呢? 目前唯一的解决方法是将类名添加到每个静态字段名之前,这是一个非常丑陋的解决方案。

private static TBase_s_field = 'something';
...
private static TDerived_s_field = 'something else';

ps 使用 typescript 2.0.3

【问题讨论】:

    标签: inheritance typescript static-variables


    【解决方案1】:

    您不能在派生类中重新声明private 字段。如果您希望派生类能够重新声明或访问该字段,请使用 protected

    这是强制执行的,因为派生类中也可以使用静态方法。例如,这段代码做了一些意想不到的事情(如果我们忽略编译错误):

    class Base {
        private static foo = 'base';
    
        static printName() {
            // Should always print 'base' because no one
            // else has access to change 'foo'
            console.log(this.foo);
        }
    }
    
    class Derived extends Base {
        private static foo = 'derived';
    }
    // Will actually print 'derived'
    Derived.printName();
    

    【讨论】:

    • 此限制背后的任何背景?它反对来自其他语言的常见继承实践。
    • JavaScript 中的属性都进入同一个基于字符串的查找表,因此无法将两个同名字段存储在具有两个不同地址的同一个逻辑对象中可以为分辨率发出不同查找表的语言
    • 在这种情况下,我们实际上是在尝试将两个具有相同名称的字段存储在两个不同的对象中。基本上添加这些静态字段假设等同于 Object.defineProperty(TBase, "s_field", {value: 'something'}); Object.defineProperty(TDerived, "s_field", {value: 'something else'});
    • 这不会改变任何事情。当您通过派生类调用基类中的方法(静态方法也被继承)时,问题就出现了——该方法将读取“错误的”私有值。
    • 不,不会。 Javascript 使用基于原型的继承,因此派生类静态端中的静态字段将始终正确覆盖基类静态端中的静态字段(通过直接访问基类静态端仍然可用)。当 Javascript 解释器发现 TDerived 有 s_field 时,它根本不会更深入地检查 s_field 是否存在于 TDerived.prototype 中。私有修改的唯一区别(至少假设是)是强制打字稿编译器禁止访问类代码之外的 s_field (在编译时)。
    猜你喜欢
    • 2020-09-08
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2014-04-27
    • 2010-11-22
    • 2014-07-22
    • 1970-01-01
    相关资源
    最近更新 更多