Как получить доступ к статическим членам из методов экземпляра в typescript?

Я пытаюсь использовать статический член из метода экземпляра. Я знаю о доступе к статическому члену от нестатической функции в typescript, но я не хочу жестко кодировать класс, чтобы разрешить наследование:

class Logger {
  protected static PREFIX = '[info]';

  public log(msg: string) {
    console.log(Logger.PREFIX + ' ' + msg); // What to use instead of Logger` to get the expected result?
  }
}

class Warner extends Logger {
  protected static PREFIX = '[warn]';
}

(new Logger).log('=> should be prefixed [info]');
(new Warner).log('=> should be prefixed [warn]');

Я пробовал такие вещи, как

typeof this.PREFIX

Ответ 1

Вам просто нужно ClassName.property:

class Logger {
  protected static PREFIX = '[info]';
  public log(message: string): void {
    alert(Logger.PREFIX + string); 
  }
}

class Warner extends Logger {
  protected static PREFIX = '[warn]';
}

MORE

from: http://basarat.gitbooks.io/typescript/content/docs/classes.html

Классы

TypeScript поддерживают статические свойства, которые совместно используются всеми экземплярами класса. Естественным местом для размещения (и доступа) является сам класс, и именно это делает TypeScript:

class Something {
    static instances = 0;
    constructor() {
        Something.instances++;
    }
}

var s1 = new Something();
var s2 = new Something();
console.log(Someting.instances); // 2

UPDATE

Если вы хотите, чтобы он наследовал от конкретного конструктора экземпляра, используйте this.constructor. К сожалению, вам нужно использовать некоторое утверждение типа. Я использую typeof Logger, показанный ниже:

class Logger {
  protected static PREFIX = '[info]';
  public log(message: string): void {
    var logger = <typeof Logger>this.constructor; 
    alert(logger.PREFIX + message); 
  }
}

class Warner extends Logger {
  protected static PREFIX = '[warn]';
}