5 votes

Erreur '... incorrectly extends base class static side' lors de la substitution d'un champ statique dans une classe dérivée.

La surcharge d'un champ statique dans une classe dérivée provoque

error TS2417 : Build:Class static side 'typeof TDerived' incorrectly extends base class static side 'typeof TBase'.

Est-ce un cas d'erreur légitime ?

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

Comment dois-je alors traiter les champs statiques ? Le seul moyen de contourner ce problème serait de faire précéder le nom de la classe par celui de chaque champ statique, ce qui est une solution exceptionnellement moche.

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

ps utilisant typescript 2.0.3

2voto

Ryan Cavanaugh Points 17393

Vous ne pouvez pas redéclarer un private dans une classe dérivée. Utilisez protected si vous souhaitez que les classes dérivées puissent redéclarer le champ ou y accéder.

Cette règle est appliquée parce que les méthodes statiques sont également disponibles dans la classe dérivée. Par exemple, ce code fait quelque chose d'inattendu (si nous ignorons l'erreur de compilation) :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X