2017-06-30 71 views
-1

我有一些關於打字稿/ javascript繼承的問題。我有以下的基類(表達控制路由器):手稿的繼承

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; 

及以下類,實現了基地:

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

export default class CardCtrl extends BaseCtrl { 
    model = Card; 

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

} 

此代碼給我的錯誤:

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

我想知道如何調用超級方法。誰能幫我?

+0

爲什麼這個downvoted範圍綁定? – dopatraman

回答

0

Working DEMO

你定義getAll作爲成員屬性,但您需要將其定義爲正常的成員方法

Typescript重寫功能適用於成員方法而不是屬性。

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

} 

Propably,您可能需要使用getAll作爲參考傳遞到路由器的時候,那麼你可能需要這樣的cardCtrl.getAll.bind(cardCtrl);

+0

嗨Mouneer。你有沒有遇到過使用這段代碼在基類中未定義「this」的問題?我收到這個錯誤,我不知道爲什麼! –

+0

您需要註冊示波器。檢查我的答案編輯 – Mouneer

+0

檢查我的編輯。而不是像'cardCtrl.getAll'那樣使用它來綁定範圍。得到它了? – Mouneer

2

您需要定義getAll作爲一個適當的方法:

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; 

然後,你可以重寫它:

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

嗨馬蒂亞斯!謝謝你的回答!你知道我怎麼能得到這個代碼使用routes.route: router.route('/ cards')。get(passport.authenticate('login',{session:false}),cardCtrl.getAll); 如果我像你說的那樣轉換,這段代碼就會被破壞,因爲getAll不是一個帶有函數的屬性。 –