Typescript: Наследование и статические члены

Созданный на 8 дек. 2015  ·  1Комментарий  ·  Источник: microsoft/TypeScript

Я думаю, что это полезно для доступа к статическим членам:

  • из экземпляров
  • из подклассов

Ниже пример:

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

Самый полезный комментарий

Мы не можем сделать это так, как вы предлагаете, поскольку this.type используется для доступа к свойству _instance_ с именем type , а не к свойству _static_.

Однако ваш пример работает, если вы напишете его следующим образом:

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'

По умолчанию свойство constructor экземпляра имеет тип Function , но вы можете специализировать его на классе, объявив его вручную. Как только вы это сделаете, вы сможете получить доступ к статике через this.constructor.xxx , и вы получите свойства объекта-конструктора, который фактически создал экземпляр (т. Е. Производного объекта-конструктора).

>Все замечания

Мы не можем сделать это так, как вы предлагаете, поскольку this.type используется для доступа к свойству _instance_ с именем type , а не к свойству _static_.

Однако ваш пример работает, если вы напишете его следующим образом:

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'

По умолчанию свойство constructor экземпляра имеет тип Function , но вы можете специализировать его на классе, объявив его вручную. Как только вы это сделаете, вы сможете получить доступ к статике через this.constructor.xxx , и вы получите свойства объекта-конструктора, который фактически создал экземпляр (т. Е. Производного объекта-конструктора).

Была ли эта страница полезной?
0 / 5 - 0 рейтинги