2017-11-19 5 views
1

Ich habe eine Basisklasse A und eine erweiterte Klasse B, die die Fetch-Methode von A überschreibt. Allerdings, wenn ich B.fetch() aufrufen, protokolliert 'Basisklasse'. Warum ruft es nicht die in B definierte Methodendefinition auf?Typescript-Methode Override funktioniert nicht

 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

Wie Sie die 'fetch' Methode aus der Klasse B anrufen? Kannst du diesen Teil posten? – Niladri

+0

@Niladri Ich habe es hinzugefügt – Chris

+0

@Chris 'B.fetch()' gibt ein 'Versprechen ' zurück und kann nicht 'b' vom Typ' B' zugewiesen werden. Ich nehme an, das ist alles Pseudo-Code, weil 'apiPath = this.apiPath' in Ihrer Methodensignatur auch nicht kompiliert wird, weil' apiPath' nicht statisch ist. Kannst du Plunkr anbieten, die dein Verhalten zeigen? – zgue

Antwort

0

Statische Elemente werden der Konstruktorfunktion zugewiesen. Sie müssen es wie B.fetch(...) nennen.

Resultierende js Code für Ihr Beispiel Klassen:

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)); 

Das heißt, Sie A.fetch(...) genannt.

+0

Ich rufe tatsächlich B.fetch() (siehe aktualisierte Frage) – Chris

0

Nun, die Methodensignaturen sind unterschiedlich. In A geben Sie Promise<any> zurück, aber in B geben Sie Promise<Data> zurück.

Sie können in this snippet sehen, dass, was Sie sicher arbeiten können, versuchen zu tun:

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}`); 
Verwandte Themen