2017-06-30 12 views
-1

Ich habe einige Fragen zu Typoskript/Javascript Vererbung. Ich habe die folgende Basisklasse (Express Controller-Router):Typescript Vererbung

abstract class BaseCtrl { 
    abstract model; 

    // Get all 
    getAll = (req, res) => { 
    this.model.find({}, (err, docs) => { 
     if (err) { return console.error(err); } 
     res.json(docs); 
    }); 
    }; 
export default BaseCtrl; 

Und die folgende Klasse, die diese Basis implementiert:

import BaseCtrl from './base'; 
import Card from '../models/card'; 

export default class CardCtrl extends BaseCtrl { 
    model = Card; 

    getAll = (req, res) => { 
    super.getAll(req, res); 
    } 

} 

Dieser Code gibt mir den Fehler:

Only public and protected methods of the base class are accessible via the super keyword

I möchte wissen, wie man die Supermethode nennt. Kann mir jemand helfen?

+0

warum wurde diese Downvoted? – dopatraman

Antwort

0

Working DEMO

Sie definieren getAll als Mitglied Eigenschaft aber Sie müssen es als normale Mitgliedsmethode definieren

Typoskript-Überschreibungsfunktionen funktionieren ordnungsgemäß mit Elementmethoden und nicht mit Eigenschaften.

abstract class BaseCtrl { 
    abstract model;  
    // Get all 
    getAll (req, res) { 
     this.model.find({}, (err, docs) => { 
      if (err) { return console.error(err); } 
      res.json(docs); 
     }); 
    }; 
} 

export class CardCtrl extends BaseCtrl { 
    getAll (req, res) { 
    super.getAll(req, res); 
    } 

} 

Vermutlich müssen Sie möglicherweise getAll als Referenz verwenden, wenn an den Router vorbei, so dass Sie diese den Umfang binden, müssen wie cardCtrl.getAll.bind(cardCtrl);

+0

Hallo Mouneer. Haben Sie jemals das Problem gesehen, dass "dies" in der Basisklasse und unter Verwendung dieses Codes nicht definiert ist? Ich bekomme diesen Fehler und ich weiß nicht warum! –

+0

Sie müssen das Oszilloskop starten. Überprüfen Sie meine Antwort bearbeiten – Mouneer

+0

check my edit. Anstatt es als 'cardCtrl.getAll' zu verwenden, binden Sie den Bereich. Ich habs? – Mouneer

2

Sie benötigen getAll als richtige Methode zu definieren:

abstract class BaseCtrl { 
    abstract model; 

    // Get all 
    getAll(req, res) { 
     this.model.find({}, (err, docs) => { 
      if (err) { return console.error(err); } 
      res.json(docs); 
     }); 
    } 
}; 
export default BaseCtrl; 

Dann können Sie es außer Kraft setzen:

import BaseCtrl from './base'; 
import Card from '../models/card'; 

export default class CardCtrl extends BaseCtrl { 
    model = Card; 

    getAll(req, res) { 
     super.getAll(req, res); 
    } 
} 
+0

Hallo Matias! Danke für deine Antwort! Weißt du, wie ich diesen Code mit den routes.route bekommen kann: router.route ('/ cards'). Get (pass.authenticate ('Login', {Sitzung: false}), cardCtrl.getAll); Wenn ich wie Sie gesagt transformieren, wird dieser Code gebrochen, weil getAll nicht mehr eine Eigenschaft mit Funktion ist. –