title: How to define an array of classes in Typescript (not instances)
body: <p>I am trying out some language constructs in Typescript. I am looking to make an array of classes, where the classes are later instantiated.
  The code I have seems to compile and works if I try it on the <a href="https://www.typescriptlang.org/play/#src=class%20BaseGreeter%20%7B%0D%0A%20%20%20%20greeting%3A%20string%3B%0D%0A%20%20%20%20greeting_start%3A%20string%3B%0D%0A%20%20%20%20constructor(message%3A%20string)%20%7B%0D%0A%20%20%20%20%20%20%20%20this.greeting%20%3D%20message%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20greet()%20%7B%0D%0A%20%20%20%20%20%20%20%20return%20this.greeting_start%20%2B%20%22%2C%20%22%20%2B%20this.greeting%3B%0D%0A%20%20%20%20%7D%0D%0A%7D%0D%0A%0D%0Aclass%20Greeter%20extends%20BaseGreeter%7B%0D%0A%20%20%20%20%0D%0A%20%20%20%20constructor(message%3A%20string)%20%7B%0D%0A%20%20%20%20%20%20%20%20super(message)%3B%0D%0A%20%20%20%20%20%20%20%20this.greeting_start%20%3D%20%22Hello%22%3B%0D%0A%20%20%20%20%7D%0D%0A%7D%0D%0A%0D%0Aclass%20Greeter2%20extends%20BaseGreeter%20%7B%0D%0A%20%20%20%20constructor(message%3A%20string)%20%7B%0D%0A%20%20%20%20%20%20%20%20super(message)%3B%0D%0A%20%20%20%20%20%20%20%20this.greeting_start%20%3D%20%22Bye%22%3B%0D%0A%20%20%20%20%7D%0D%0A%7D%0D%0A%0D%0Aclass%20Greeter3%20extends%20BaseGreeter%20%7B%0D%0A%20%20%20%20constructor(message%3A%20string)%20%7B%0D%0A%20%20%20%20%20%20%20%20super(message)%3B%0D%0A%20%20%20%20%20%20%20%20this.greeting_start%20%3D%20%22Adieu%22%3B%0D%0A%20%20%20%20%7D%0D%0A%7D%0D%0A%0D%0A%0D%0Afunction%20getGreeters()%20%3A%5Bstring%2C%20BaseGreeter%5B%5D%5D%7B%0D%0A%20%20%20%20let%20greeters%20%3D%20new%20Array%3CBaseGreeter%3E()%3B%0D%0A%20%20%20%20greeters.push(Greeter)%3B%0D%0A%20%20%20%20greeters.push(Greeter2)%3B%0D%0A%20%20%20%20greeters.push(Greeter3)%3B%0D%0A%20%20%20%20return%20%5B%22test%22%2C%20greeters%5D%3B%0D%0A%7D%0D%0A%0D%0Alet%20foo%20%3D%20%7B%7D%3B%0D%0Alet%20retval%20%3D%20getGreeters()%3B%0D%0Aalert(retval%5B0%5D)%3B%0D%0Afoo%5B%27greeters%27%5D%20%3D%20retval%5B1%5D%3B%0D%0Avar%20i%20%3D%200%3B%0D%0A%0D%0Alet%20button%20%3D%20document.createElement(%27button%27)%3B%0D%0Abutton.textContent%20%3D%20%22Say%20Hello%22%3B%0D%0Abutton.onclick%20%3D%20function%20()%20%7B%0D%0A%20%20%20%20let%20greeter%20%3D%20new%20foo%5B%27greeters%27%5D%5Bi%5D(%22cruel%20world%22)%3B%0D%0A%20%20%20%20alert(greeter.greet())%3B%0D%0A%20%20%20%20i%20%3D%20i%20%2B%201%3B%0D%0A%7D%0D%0A%0D%0Adocument.body.appendChild(button)%3B" rel="noreferrer">Typescript Playground</a> but it does give an error in the typescript box: <code>Argument of type 'typeof Greeter' is not assignable to parameter of type 'BaseGreeter'.</code></p>
  
  <p>I guess this is because the array definition expects instances of classes that extend BaseGreeter, not the classes themselves that extend it. Is that correct? If that is the case, how do I define an array of classes that extend BaseGreeter?</p>
  
  <p>This is the code:</p>
  
  <pre><code>class BaseGreeter {
      greeting: string;
      greeting_start: string;
      constructor(message: string) {
          this.greeting = message;
      }
      greet() {
          return this.greeting_start + ", " + this.greeting;
      }
  }
  
  class Greeter extends BaseGreeter{
  
      constructor(message: string) {
          super(message);
          this.greeting_start = "Hello";
      }
  }
  
  class Greeter2 extends BaseGreeter {
      constructor(message: string) {
          super(message);
          this.greeting_start = "Bye";
      }
  }
  
  class Greeter3 extends BaseGreeter {
      constructor(message: string) {
          super(message);
          this.greeting_start = "Adieu";
      }
  }
  
  
  function getGreeters() :[string, BaseGreeter[]]{
      let greeters = new Array&lt;BaseGreeter&gt;();
      greeters.push(Greeter);
      greeters.push(Greeter2);
      greeters.push(Greeter3);
      return ["test", greeters];
  }
  
  let foo = {};
  let retval = getGreeters();
  alert(retval[0]);
  foo['greeters'] = retval[1];
  var i = 0;
  
  let button = document.createElement('button');
  button.textContent = "Say Hello";
  button.onclick = function () {
      let greeter = new foo['greeters'][i]("cruel world");
      alert(greeter.greet());
      i = i + 1;
  }
  
  document.body.appendChild(button);
  </code></pre>