title: Constraints a member to just accept a type (not an instance) that extends or implements other type [TypeScript]
body: <p>I need some help with a litter of abstractions in typescript.</p>
  
  <p>I want to constraints a member to just accept types as values but those types need to implement or extend other types or interfaces.</p>
  
  <p>Eg.</p>
  
  <p>The following example does not represent or is related to a real data model, instead is an example to illustrate the goal.</p>
  
  <pre><code>interface Profession {
    work()
  }
  
  class Engineer implements Profession {
    work() {...}
  }
  
  class Doctor  {
    work() {...}
  }
  
  interface ProfessionRankingMap {
    top1ProfessionType: // Here is where I don't know how to constraint
    top2ProfessionType: // Here is where I don't know how to constraint
  }
  
  const classAProfessionRankingMap: ProfessionRankingMap {
    // This is okay, Type Engineer implements Profession interface
    top1ProfessionType: Engineer
    // This is bad, Type Doctor doesn't implement Profession interface
    top2ProfessionType: Doctor
  }
  
  const classBProfessionRankingMap: ProfessionRankingMap {
    // This is bad, [new Engineer()] returns an instance not a type
    top1ProfessionType: new Engineer()
    // This is bad, [new Doctor()] returns an instance not a type
    top2ProfessionType: new Doctor()
  }
  </code></pre>