<blockquote>
<p dir="auto">Suggestion moved over from <a href="https://typescript.codeplex.com/workitem/2438/" rel="nofollow">codeplex</a>.</p>
</blockquote>
<p dir="auto">The suggestion is to allow generic parameter overloads like the following:</p>
<div class="highlight highlight-source-ts notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="declare module Backbone {
    class Model{}
    class Events{}
    class ViewOptions&lt;TModel extends Model&gt; {}
    class Collection&lt;TModel extends Model&gt; {}

    // Generic parameter overload
    class View extends View&lt;Backbone.Model&gt;;
    class View&lt;TModel extends Model&gt; extends Events { // Don't take as duplicate identifier
        constructor(options?: ViewOptions&lt;TModel&gt;);
        model: TModel;
        collection: Collection&lt;TModel&gt;;
    }
}

// With Generics Parameter overloads, old non-generic consumer
// code works as before and does not need to change.
class MyView extends Backbone.View {
}
var myView = new MyView();
var model = myView.model; // model is of type Backbone.Model

// Can gradually introduce generic parameters to Views
class DerivedModel extends Backbone.Model { 
}
var myView2 = new Backbone.View&lt;DerivedModel&gt;();
var model2 = myView2.model; // model2 is of type DerivedModel"><pre class="notranslate"><span class="pl-k">declare</span> module <span class="pl-smi">Backbone</span> <span class="pl-kos">{</span>
    <span class="pl-k">class</span> <span class="pl-smi">Model</span><span class="pl-kos">{</span><span class="pl-kos">}</span>
    <span class="pl-k">class</span> <span class="pl-smi">Events</span><span class="pl-kos">{</span><span class="pl-kos">}</span>
    <span class="pl-k">class</span> <span class="pl-smi">ViewOptions</span><span class="pl-c1">&lt;</span><span class="pl-smi">TModel</span> <span class="pl-k">extends</span> <span class="pl-smi">Model</span><span class="pl-c1">&gt;</span> <span class="pl-kos">{</span><span class="pl-kos">}</span>
    <span class="pl-k">class</span> <span class="pl-smi">Collection</span><span class="pl-c1">&lt;</span><span class="pl-smi">TModel</span> <span class="pl-k">extends</span> <span class="pl-smi">Model</span><span class="pl-c1">&gt;</span> <span class="pl-kos">{</span><span class="pl-kos">}</span>

    <span class="pl-c">// Generic parameter overload</span>
    <span class="pl-k">class</span> <span class="pl-smi">View</span> <span class="pl-k">extends</span> <span class="pl-smi">View</span><span class="pl-kos">&lt;</span><span class="pl-smi">Backbone</span><span class="pl-kos">.</span><span class="pl-smi">Model</span><span class="pl-kos">&gt;</span><span class="pl-kos">;</span>
    <span class="pl-k">class</span> <span class="pl-smi">View</span><span class="pl-c1">&lt;</span><span class="pl-smi">TModel</span> <span class="pl-k">extends</span> <span class="pl-smi">Model</span><span class="pl-c1">&gt;</span> <span class="pl-k">extends</span> <span class="pl-smi">Events</span> <span class="pl-kos">{</span> <span class="pl-c">// Don't take as duplicate identifier</span>
        <span class="pl-c1">constructor</span><span class="pl-kos">(</span><span class="pl-s1">options</span>?: <span class="pl-smi">ViewOptions</span><span class="pl-kos">&lt;</span><span class="pl-smi">TModel</span><span class="pl-kos">&gt;</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
        <span class="pl-c1">model</span>: <span class="pl-smi">TModel</span><span class="pl-kos">;</span>
        <span class="pl-c1">collection</span>: <span class="pl-smi">Collection</span><span class="pl-kos">&lt;</span><span class="pl-smi">TModel</span><span class="pl-kos">&gt;</span><span class="pl-kos">;</span>
    <span class="pl-kos">}</span>
<span class="pl-kos">}</span>

<span class="pl-c">// With Generics Parameter overloads, old non-generic consumer</span>
<span class="pl-c">// code works as before and does not need to change.</span>
<span class="pl-k">class</span> <span class="pl-smi">MyView</span> <span class="pl-k">extends</span> <span class="pl-smi">Backbone</span><span class="pl-kos">.</span><span class="pl-c1">View</span> <span class="pl-kos">{</span>
<span class="pl-kos">}</span>
<span class="pl-k">var</span> <span class="pl-s1">myView</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">MyView</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">model</span> <span class="pl-c1">=</span> <span class="pl-s1">myView</span><span class="pl-kos">.</span><span class="pl-c1">model</span><span class="pl-kos">;</span> <span class="pl-c">// model is of type Backbone.Model</span>

<span class="pl-c">// Can gradually introduce generic parameters to Views</span>
<span class="pl-k">class</span> <span class="pl-smi">DerivedModel</span> <span class="pl-k">extends</span> <span class="pl-smi">Backbone</span><span class="pl-kos">.</span><span class="pl-c1">Model</span> <span class="pl-kos">{</span> 
<span class="pl-kos">}</span>
<span class="pl-k">var</span> <span class="pl-s1">myView2</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">Backbone</span><span class="pl-kos">.</span><span class="pl-c1">View</span><span class="pl-kos">&lt;</span><span class="pl-smi">DerivedModel</span><span class="pl-kos">&gt;</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">model2</span> <span class="pl-c1">=</span> <span class="pl-s1">myView2</span><span class="pl-kos">.</span><span class="pl-c1">model</span><span class="pl-kos">;</span> <span class="pl-c">// model2 is of type DerivedModel</span></pre></div>
<p dir="auto">This is important because this would allow people to introduce generics in their library declarations without breaking large amounts of existing code for the consumers. We do this a lot in C#, and it is compatible with TypeScript design because it won't make any changes in the resulting javascript, and works pretty much like method overloads in TypeScript.</p>
<p dir="auto">Related discussion: <a href="https://typescript.codeplex.com/discussions/452741" rel="nofollow">https://typescript.codeplex.com/discussions/452741</a></p>
<p dir="auto">Access to the parent class's static methods and properties should be available from a derived class's static methods and properties via <code class="notranslate">super</code> (<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/super#Super-calling_static_methods" rel="nofollow">MDN reference</a>). Typescript compiler currently emits an error for using <code class="notranslate">super</code> in a static context.</p>
<p dir="auto"><strong>TypeScript Version:</strong></p>
<p dir="auto">1.8.7, also on <a href="http://www.typescriptlang.org/Playground" rel="nofollow">Typescript playground</a> though I don't know what version that is.</p>
<p dir="auto"><strong>Code</strong></p>
<div class="highlight highlight-source-ts notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="class AppComponent {
  public static title: string = 'This is an app';
  public get title(): string {
    return (&lt;typeof AppComponent&gt;this.constructor).title;
  }
}

class ReloadedApp extends AppComponent {
  public static title: string = `${super.title}: Reloaded`;
}

alert((new ReloadedApp).title);"><pre class="notranslate"><span class="pl-k">class</span> <span class="pl-smi">AppComponent</span> <span class="pl-kos">{</span>
  <span class="pl-k">public</span> <span class="pl-k">static</span> <span class="pl-c1">title</span>: <span class="pl-smi">string</span> <span class="pl-c1">=</span> <span class="pl-s">'This is an app'</span><span class="pl-kos">;</span>
  <span class="pl-k">public</span> <span class="pl-k">get</span> <span class="pl-en">title</span><span class="pl-kos">(</span><span class="pl-kos">)</span>: <span class="pl-smi">string</span> <span class="pl-kos">{</span>
    <span class="pl-k">return</span> <span class="pl-kos">(</span><span class="pl-kos">&lt;</span><span class="pl-k">typeof</span> <span class="pl-smi">AppComponent</span><span class="pl-kos">&gt;</span><span class="pl-smi">this</span><span class="pl-kos">.</span><span class="pl-c1">constructor</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-c1">title</span><span class="pl-kos">;</span>
  <span class="pl-kos">}</span>
<span class="pl-kos">}</span>

<span class="pl-k">class</span> <span class="pl-smi">ReloadedApp</span> <span class="pl-k">extends</span> <span class="pl-smi">AppComponent</span> <span class="pl-kos">{</span>
  <span class="pl-k">public</span> <span class="pl-k">static</span> <span class="pl-c1">title</span>: <span class="pl-smi">string</span> <span class="pl-c1">=</span> <span class="pl-s">`<span class="pl-s1"><span class="pl-kos">${</span><span class="pl-smi">super</span><span class="pl-kos">.</span><span class="pl-c1">title</span><span class="pl-kos">}</span></span>: Reloaded`</span><span class="pl-kos">;</span>
<span class="pl-kos">}</span>

<span class="pl-en">alert</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-k">new</span> <span class="pl-smi">ReloadedApp</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-c1">title</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div>
<p dir="auto"><strong>Expected behavior:</strong></p>
<p dir="auto">I would expect this to compile and run correctly with no errors. Expected alert:</p>
<blockquote>
<p dir="auto">This is an app: Reloaded</p>
</blockquote>
<p dir="auto">Expected compiled (ES5) code:</p>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="var __extends = // __extends definition
var AppComponent = // AppComponent definition
var ReloadedApp = (function (_super) {
    __extends(ReloadedApp, _super);
    function ReloadedApp() {
        _super.apply(this, arguments);
    }
    ReloadedApp.title = _super.title + &quot;: Reloaded&quot;;
    return ReloadedApp;
}(AppComponent));
alert((new ReloadedApp).title);"><pre class="notranslate"><span class="pl-k">var</span> <span class="pl-s1">__extends</span> <span class="pl-c1">=</span> <span class="pl-c">// __extends definition</span>
<span class="pl-s1">var</span> <span class="pl-v">AppComponent</span> <span class="pl-c1">=</span> <span class="pl-c">// AppComponent definition</span>
<span class="pl-s1">var</span> <span class="pl-v">ReloadedApp</span> <span class="pl-c1">=</span> <span class="pl-kos">(</span><span class="pl-k">function</span> <span class="pl-kos">(</span><span class="pl-s1">_super</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
    <span class="pl-s1">__extends</span><span class="pl-kos">(</span><span class="pl-v">ReloadedApp</span><span class="pl-kos">,</span> <span class="pl-s1">_super</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
    <span class="pl-k">function</span> <span class="pl-v">ReloadedApp</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
        <span class="pl-s1">_super</span><span class="pl-kos">.</span><span class="pl-en">apply</span><span class="pl-kos">(</span><span class="pl-smi">this</span><span class="pl-kos">,</span> <span class="pl-smi">arguments</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
    <span class="pl-kos">}</span>
    <span class="pl-v">ReloadedApp</span><span class="pl-kos">.</span><span class="pl-c1">title</span> <span class="pl-c1">=</span> <span class="pl-s1">_super</span><span class="pl-kos">.</span><span class="pl-c1">title</span> <span class="pl-c1">+</span> <span class="pl-s">": Reloaded"</span><span class="pl-kos">;</span>
    <span class="pl-k">return</span> <span class="pl-v">ReloadedApp</span><span class="pl-kos">;</span>
<span class="pl-kos">}</span><span class="pl-kos">(</span><span class="pl-v">AppComponent</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-en">alert</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-k">new</span> <span class="pl-v">ReloadedApp</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-c1">title</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div>
<p dir="auto"><strong>Actual behavior:</strong></p>
<p dir="auto">Compiles and runs correctly, but emits error:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class."><pre class="notranslate"><code class="notranslate">error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class.
</code></pre></div>