【问题标题】:Typescript inheritance打字稿继承
【发布时间】:2017-12-04 19:01:15
【问题描述】:

我有一些关于 typescript/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);
  }

}

这段代码给了我错误:

只有基类的公共和受保护方法可以通过 super 关键字访问

我想知道如何调用超级方法。谁能帮帮我?

【问题讨论】:

  • 为什么这被否决了?

标签: javascript node.js express typescript


【解决方案1】:

您需要将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);
     }
}

【讨论】:

  • 嗨,马蒂亚斯!谢谢你的回答!你知道我怎样才能让这个代码与 routes.route 一起工作: router.route('/cards').get(passport.authenticate('login', {session: false}), cardCtrl.getAll);如果我像你说的那样进行转换,那么这段代码就会被破坏,因为 getAll 不再是一个具有函数的属性。
【解决方案2】:

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

}

可能你在传递给路由器的时候可能需要使用getAll作为引用,所以你可能需要像cardCtrl.getAll.bind(cardCtrl);这样绑定作用域

【讨论】:

  • 你好穆内尔。您是否曾经遇到过使用此代码在基类中未定义“this”的问题?我收到了这个错误,我不知道为什么!
  • 检查我的编辑。而不是将其用作cardCtrl.getAll 绑定范围。明白了吗?
  • 太棒了!非常感谢穆内尔! :)
猜你喜欢
  • 2017-07-14
  • 1970-01-01
  • 2017-04-10
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 2017-09-11
  • 1970-01-01
相关资源
最近更新 更多