38

I try to use a static member from an instance method. I know about accessing static member from non-static function in typescript, but I do not want to hard code the class to allow inheritance:

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]');

I've tried things like

typeof this.PREFIX
2
  • 1
    TLDR - ClassName.property. For overridden properties, (<typeof ClassName> this.constructor).property. Commented Oct 2, 2020 at 18:56
  • These days you should use (this.constructor as typeof ClassName).property which is equivalent but the more modern syntax Commented Nov 17, 2024 at 16:08

1 Answer 1

45

You simply need ClassName.property :

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

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

MORE

from : https://basarat.gitbook.io/typescript/future-javascript/classes

TypeScript classes support static properties that are shared by all instances of the class. A natural place to put (and access) them is on the class itself and that is what TypeScript does:

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

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

UPDATE

If you want it to inherit from the particular instance's constructor use this.constructor. Sadly you need to use some type assertion. I am using typeof Logger shown below:

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]';
}
Sign up to request clarification or add additional context in comments.

10 Comments

I know about using the ClassName.property. But then it will use Logger.PREFIX even in subclasses that have their own .PREFIX defined.
Updated the question to be more clear about the expected result.
@SimonHürlimann Updated the answer to take that into account ;)
This does not work. For example: ``` const a = new Logger(); a.log('a ') const b = new Warner(); b.log('b ') ``` Both log Info
Why this answer is voted up? Warner instance printed out [info]
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.