Typescript: Herança e membros estáticos

Criado em 8 dez. 2015  ·  1Comentário  ·  Fonte: microsoft/TypeScript

Acho que é útil para acessar membros estáticos:

  • de instâncias
  • de sub classes

Abaixo um exemplo:

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

Comentários muito úteis

Não podemos fazer isso da maneira que você sugeriu, pois this.type é usado para acessar uma propriedade _instance_ chamada type , não uma propriedade _static_.

No entanto, seu exemplo funcionará se você escrevê-lo da seguinte maneira:

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'

Por padrão, a propriedade constructor de uma instância é do tipo Function , mas você pode especializá-la em uma classe declarando-a manualmente. Depois de fazer isso, você pode acessar a estática por meio de this.constructor.xxx e obterá as propriedades do objeto construtor que realmente criou a instância (ou seja, o objeto construtor derivado).

>Todos os comentários

Não podemos fazer isso da maneira que você sugeriu, pois this.type é usado para acessar uma propriedade _instance_ chamada type , não uma propriedade _static_.

No entanto, seu exemplo funcionará se você escrevê-lo da seguinte maneira:

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'

Por padrão, a propriedade constructor de uma instância é do tipo Function , mas você pode especializá-la em uma classe declarando-a manualmente. Depois de fazer isso, você pode acessar a estática por meio de this.constructor.xxx e obterá as propriedades do objeto construtor que realmente criou a instância (ou seja, o objeto construtor derivado).

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

MartynasZilinskas picture MartynasZilinskas  ·  3Comentários

manekinekko picture manekinekko  ·  3Comentários

Antony-Jones picture Antony-Jones  ·  3Comentários

DanielRosenwasser picture DanielRosenwasser  ·  3Comentários

bgrieder picture bgrieder  ·  3Comentários