Я думаю, что это полезно для доступа к статическим членам:
Ниже пример:
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'
Мы не можем сделать это так, как вы предлагаете, поскольку 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_.Однако ваш пример работает, если вы напишете его следующим образом:
По умолчанию свойство
constructor
экземпляра имеет типFunction
, но вы можете специализировать его на классе, объявив его вручную. Как только вы это сделаете, вы сможете получить доступ к статике черезthis.constructor.xxx
, и вы получите свойства объекта-конструктора, который фактически создал экземпляр (т. Е. Производного объекта-конструктора).