2017-11-19 5 views
1

私はベースクラスAと、Aのフェッチメソッドをオーバーライドする拡張クラスBを持っています。 しかし私がB.fetch()を呼び出すと、 'baseclass'がログに記録されます。なぜそれがBで定義されたメソッド定義を呼び出さないのですか?typescriptメソッドオーバーライドが機能しません。

 class A { 
     protected apiPath: string = '' 
     static async fetch (id = null, Model = this, apiPath = this.apiPath): Promise<any> { 
      console.log('basefetch') 
      let url = apiPath 
      if(id) url += '/' + id 
      let { data } = await axios.get(url) 
      let item: any = new Model(data) 
      return item 
     } 
    } 

    class B extends A { 
     static async fetch(id = null, Model = this, apiPath = this.apiPath): Promise<Data> { 
      console.log('childfetch') 
      let {data} = await axios.get(apiPath) 
      if (typeof data.challenge.participating == 'undefined') { 
       data.challenge.participating = null 
      } 
      if (typeof data.challenge.progress == 'undefined') { 
       data.challenge.progress = null 
      } 
      return new Model(data) 
     } 

class SomeOtherModule { 
    async doSomething() { 
     let b: B = await B.fetch() 
    } 
} 
+0

を使用すると、クラスBから 'fetch'メソッドを呼び出している方法は?あなたはその部分を投稿できますか? – Niladri

+0

@ニラドリ私はそれを追加しました – Chris

+0

@Chris 'B.fetch()は' Promise 'を返し、' B'型の 'b'に代入することはできません。 'apiPath'は静的ではないので、メソッドシグネチャの' apiPath = this.apiPath'もコンパイルされないので、これはすべて擬似コードとみなします。自分の行動を示すplunkrを提供できますか? – zgue

答えて

0

スタティックメンバーは、コンストラクタ関数に割り当てられます。 B.fetch(...)のように呼び出す必要があります。あなたの例クラスのJSコード結果の

var A = (function() { 
    function A() { 
    } 
    A.fetch = function() { 
     console.log("A fetch"); 
    }; 
    return A; 
}()); 
var B = (function (_super) { 
    tslib_1.__extends(B, _super); 
    function B() { 
     return _super !== null && _super.apply(this, arguments) || this; 
    } 
    B.fetch = function() { 
     console.log("B fetch"); 
    }; 
    return B; 
}(A)); 

をこれは、あなたがA.fetch(...)と呼ばれることを意味します。

+0

私は実際にB.fetch()を呼び出します(更新された質問を参照してください) – Chris

0

まあ、メソッドのシグネチャは異なります。 AではPromise<any>が返されますが、BではPromise<Data>が返されます。

あなたは確かにやろうとしているか仕事ができることをthis snippetで見ることができます:

class A { 
    static fetch(): string { 
    return 'basefetch'; 
    } 
} 

class B extends A { 
    static fetch(): any { 
    return 'childfetch'; 
    } 
} 

let aVal: string = A.fetch(); 
console.log(`aVal: ${aVal}`); 

let bVal: string = B.fetch(); 
console.log(`bVal: ${bVal}`); 
関連する問題