title: Deferred that extends Promise
body: <p>How to implement a Deferred promise that extends Promise? It's important to extend Promise for type-safe usage where a typical Promise is expected.</p>
  
  <p>Following implementation</p>
  
  
  
  <pre><code>export class Deferred&lt;T&gt; extends Promise&lt;T&gt; {                                   
    public _resolveSelf;
    public _rejectSelf;                                                           
    constructor() {
      super(
        (resolve, reject) =&gt;
        {
          this._resolveSelf = resolve
          this._rejectSelf = reject
        }
      )
    }                                                                             
    public resolve(val:T) { this._resolveSelf(val) }
    public reject(reason:any) { this._rejectSelf(reason) }                        
  }
  </code></pre>
  
  <p>throws <code>TypeError: _this is undefined</code>.</p>
  
  <p>In <a href="https://www.typescriptlang.org/play/#src=class%20Deferred%3CT%3E%20extends%20Promise%3CT%3E%20%7B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0D%0A%20%20public%20_resolveSelf%3B%0D%0A%20%20public%20_rejectSelf%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0D%0A%20%20constructor()%20%7B%0D%0A%20%20%20%20super(%0D%0A%20%20%20%20%20%20(resolve%2C%20reject)%20%3D%3E%0D%0A%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20this._resolveSelf%20%3D%20resolve%0D%0A%20%20%20%20%20%20%20%20this._rejectSelf%20%3D%20reject%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20)%0D%0A%20%20%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0D%0A%20%20public%20resolve(val%3AT)%20%7B%20this._resolveSelf(val)%20%7D%0D%0A%20%20public%20reject(reason%3Aany)%20%7B%20this._rejectSelf(reason)%20%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0D%0A%7D%0D%0A%0D%0Aconst%20d%20%3D%20new%20Deferred%0D%0A%0D%0Ad.then(console.log)%0D%0A%0D%0Ad.resolve(10)" rel="nofollow noreferrer">this Typescript playground</a>, one can see that the compiled javascript is funny. In line 15, during declaration of <code>_this</code> already its properties are being assigned.</p>