打字稿:如何访问超级.在回调内部



我尝试从回调中的扩展类访问方法:

Model.findOne( { _id: id }, function( err, rec ){
    super.handleFind( err, rec ); 
});

当我编译打字稿时,我看到以下错误:

error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions.

当我运行 JavaScript 时,我得到:

TypeError: Cannot read property 'call' of undefined

如果 - 在回调之前 - 我做了一些类似 let fct = super.handleFind; 它似乎有效,但这在handleFind()中未定义 - 我需要这个上下文。

假设handleFile是在父类中定义的,然后它将被您的子类继承,除非您要覆盖子类中的handleFile并且您想改用超类中的handleFile实现,那么您可以使用 this.handleFile 调用它。

第二个问题是你正在向Model.findOne传递一个function() {...}回调,如果你想保留this上下文(让它指向你的子类的当前实例),请使用箭头函数代替,所以把你的函数改成这个

 // Use arrow function to make 'this' point to the current instance of the
 // enclosing class
Model.findOne( { _id: id }, ( err, rec ) => {
    super.handleFind( err, rec ); 
});
您可以使用Function.prototype.call()调用

传递给.findOne()的匿名函数,并将上下文设置为 thisModel class

class Test {
  constructor() {}
  handleFind(err, rec) {
    console.log(err, rec)
  }
}
class Model extends Test {
  constructor() {
    super()
  }
  findOne(id, fn) {
    fn.call(this, id, "err")
  }
}
var model = new Model();
model.findOne({id: 123}, function(err, rec) {
  this.handleFind(err, rec)
});

最新更新