将mongoose javascript代码转换为typescript。此引用已丢失

将mongoose javascript代码转换为typescript。此引用已丢失,javascript,mongodb,mongoose,typescript,Javascript,Mongodb,Mongoose,Typescript,我开始了学习打字的新冒险。我做了一个nodejs项目,当然是用javascript编写的,我正在把它转换成typescript。我的想法是看到所有的好处,了解哪里有问题,我应该使用哪种模式等等。 该项目使用mongodb数据库和mongoose javascript库,我正在努力研究typescript如何传输代码。简单地说:我失去了此引用的权限 下面是一个很好的例子,它将导致问题。 var personSchema = new mongoose.Schema({ created: {

我开始了学习打字的新冒险。我做了一个nodejs项目,当然是用javascript编写的,我正在把它转换成typescript。我的想法是看到所有的好处,了解哪里有问题,我应该使用哪种模式等等。
该项目使用mongodb数据库和mongoose javascript库,我正在努力研究typescript如何传输代码。简单地说:我失去了此引用的权限
下面是一个很好的例子,它将导致问题。

 var personSchema = new mongoose.Schema({
  created: {
   type: Date,

   default: Date.now
  },

  updated:{
   type: Date,  
  },
 });

 personSchema.pre('save', function(next) {

 // Make sure updated holds the current date/time

 this.updated = new Date();

 next();

 });

 var Person = mongoose.model('Person', personSchema);
在预保存功能中有一个参考。这是具有更新属性的当前人员的引用。一切都很好。我在不同的例子中看到了这种模式

这是我第一次参与nodejs项目。
下面是我如何尝试简单的typescript转换:

 interface IPerson extends mongoose.Document{
  created:Date;
  updated:Date;
}


 var personSchema = new mongoose.Schema({
  created: {
   type: Date,
   default: Date.now
 },

 updated: {
  type: Date
 }
});

personSchema.pre('save', (next) => {
 // Make sure updated holds the current date/time
 this.updated = new Date();

 next();
});

export =  mongoose.model<IPerson>('Person', personSchema);
接口IPerson扩展mongoose.Document{
创建日期:日期;
更新:日期;
}
var personSchema=newmongoose.Schema({
创建:{
类型:日期,
默认值:Date.now
},
更新:{
类型:日期
}
});
personSchema.pre('save',(next)=>{
//确保更新后的保持当前日期/时间
this.updated=新日期();
next();
});
导出=猫鼬。模型('Person',personSchema);
typescript传输代码后,this将与this交换。在文件顶部可以看到var\u this=this。这是错误的。新的javascript文件将释放person对象的引用。

有人能帮我把javascript正确地转换成typescript吗?我应该如何解决这类问题?有什么模式吗?
我的第一印象是,有时将javascript转换为typescript并不简单,但我真的很喜欢它。

试试这个:

var personSchema = new mongoose.Schema({
    created: {
       type: Date,
       default: Date.now
    },

    updated: {
        type: Date
    }

    saveHandler(next) {
        // Make sure updated holds the current date/time
        this.updated = new Date();

        next();
    }
});

personSchema.pre('save', personSchema.saveHandler);

所以这个问题有点老了,我不确定你是否已经解决了,但是没有选择的答案,所以这可能会帮助其他人

我自己也为此挣扎了一段时间,我相信我已经找到了答案

另外,要考虑到每种代码都是不同的,因此这可能无法解决每种情况下的问题,但请尝试去掉箭头函数。改用常规函数

ES6的arrow函数使用词法范围,因此“this”不是您在本例中实际期望的。很有可能,嗯。。。未定义,或架构本身。它没有指向文档,因此找不到它的任何方法和/或属性