Mongoose挂钩不适用于Typescript

nnsrf1az  于 2023-02-23  发布在  Go
关注(0)|答案(3)|浏览(127)

那么,有没有人知道为什么我在使用mongoose钩子并引用this时可能会得到一个Typescript错误。我没有使用箭头函数,我知道它的词法作用域问题,但即使是这样的匿名函数:

UserSchema.pre("save", function(next) {
    console.log(this.password);
    next();
});

确切的错误消息是

'this' implicitly has type 'any' because it does not have a type annotation.

有人知道怎么解决这个问题吗?
顺便说一句,我使用的是 typescript 2.5.2 / NodeJS 8.2.1
谢谢!

csbfibhn

csbfibhn1#

试试这个:

import {HydratedDocument} from 'mongoose'
schema.pre<HydratedDocument<IUser>>('save',function(next){})

而不是IUser使用您界面。

gzszwxb4

gzszwxb42#

使用ts-mongoose的最佳 typescript 示例:-

import { ExtractDoc, Type, createSchema, typedModel } from 'ts-mongoose';

const UserSchema = createSchema(
  {
    email: Type.string({ required: true, unique: true }),
    firstName: Type.string({ required: true }),
    lastName: Type.string({ required: true }),
  }
);

const User = typedModel(CONSTANTS.MODEL_NAME.USER, UserSchema, undefined, undefined, {
  updateById: function (id: string, data: {}) {
    return this.findByIdAndUpdate(id, data, { new: true });
  },

  findByUserId: function (id: string) {
    return this.findOne({ _id: id });
  },
});

type UserDoc = ExtractDoc<typeof UserSchema>;

UserSchema.pre('update', function (this: UserDoc, next) {
let phone = this.phone;
  phone = sanitizePhoneNumber(phone);
  this.save();
  next();
});
rggaifut

rggaifut3#

试试这个:

schema.pre("save", function(this: UserModel, next: any) {
  console.log(this.password);
  next();
});

我认为你得到这个错误是因为你可能有一个检查隐式any的typescript配置。如果你在钩子函数的参数中输入'* this *',这个错误应该会被解决。

相关问题