Typescript: Vererbung und statische Elemente

Erstellt am 8. Dez. 2015  ·  1Kommentar  ·  Quelle: microsoft/TypeScript

Ich denke, das ist nützlich, um auf statische Member zuzugreifen:

  • von Instanzen
  • aus Unterklassen

Unten ein Beispiel:

class A {
  protected static type: string;

 public log(): string {
    console.log(this.type);
  }
}

class B extends A {
  protected static type: string = 'C';
}

class C extends A {
  protected static type: string = 'C';
}

b = new B();
b.log(); // => 'B'

c = new C();
c.log(); // => 'C'
By Design Declined Suggestion

Hilfreichster Kommentar

Wir können es nicht so machen, wie Sie es vorschlagen, da this.type wird, um auf eine _Instanz_-Eigenschaft namens type zuzugreifen, nicht auf eine _statische_-Eigenschaft.

Ihr Beispiel funktioniert jedoch, wenn Sie es wie folgt schreiben:

class A {
  "constructor": typeof A;  // Explicitly declare constructor property
  protected static type: string;

  public log() {
    console.log(this.constructor.type);  // Access actual constructor object
  }
}

class B extends A {
  protected static type: string = 'B';
}

class C extends A {
  protected static type: string = 'C';
}

let b = new B();
b.log(); // => 'B'

let c = new C();
c.log(); // => 'C'

Standardmäßig hat die Eigenschaft constructor einer Instanz den Typ Function , aber Sie können sie auf eine Klasse spezialisieren, indem Sie sie manuell deklarieren. Sobald Sie dies getan haben, können Sie über this.constructor.xxx auf die Statik zugreifen und erhalten die Eigenschaften des Konstruktorobjekts, das die Instanz tatsächlich erstellt hat (dh das abgeleitete Konstruktorobjekt).

>Alle Kommentare

Wir können es nicht so machen, wie Sie es vorschlagen, da this.type wird, um auf eine _Instanz_-Eigenschaft namens type zuzugreifen, nicht auf eine _statische_-Eigenschaft.

Ihr Beispiel funktioniert jedoch, wenn Sie es wie folgt schreiben:

class A {
  "constructor": typeof A;  // Explicitly declare constructor property
  protected static type: string;

  public log() {
    console.log(this.constructor.type);  // Access actual constructor object
  }
}

class B extends A {
  protected static type: string = 'B';
}

class C extends A {
  protected static type: string = 'C';
}

let b = new B();
b.log(); // => 'B'

let c = new C();
c.log(); // => 'C'

Standardmäßig hat die Eigenschaft constructor einer Instanz den Typ Function , aber Sie können sie auf eine Klasse spezialisieren, indem Sie sie manuell deklarieren. Sobald Sie dies getan haben, können Sie über this.constructor.xxx auf die Statik zugreifen und erhalten die Eigenschaften des Konstruktorobjekts, das die Instanz tatsächlich erstellt hat (dh das abgeleitete Konstruktorobjekt).

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen