You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
mongoose 可以在 Schema 上定义 Model 的静态方法与 Document 的实例方法,但 TypeScript 是无法识别到的。
例如下面的代码:
const{ Schema, model }=require('mongoose')constuserSchema=newSchema({name: String,pwd: String})// 定义 Model 的静态方法userSchema.statics.findUser=function(name,pwd){returnthis.findOne({ name, pwd }).exec()}// 定义 Document 的实例方法userSchema.methods.sayHi=function(){console.log(`My name is ${this.name} and my password is ${this.pwd}.`)}// 现在就可以使用上面定义的两个方法了constUserModel=model('User',userSchema)// 使用静态方法UserModel.findUser('limingkai','123').then(...)constnewUser=newUserModel({name: 'hh',pwd: '456'})// 使用实例方法newUser.sayHi()
我在 Schema 上定义了一个静态方法和一个实例方法,但如果用 TypeScript 写上面的代码,在调用这两个方法的时候 VS Code 会报错,提示我找不到这两个方法的类型定义。
定义静态方法与实例方法
mongoose 可以在 Schema 上定义 Model 的静态方法与 Document 的实例方法,但 TypeScript 是无法识别到的。
例如下面的代码:
我在 Schema 上定义了一个静态方法和一个实例方法,但如果用 TypeScript 写上面的代码,在调用这两个方法的时候 VS Code 会报错,提示我找不到这两个方法的类型定义。
为了让 TypeScript 能检测到这些方法,只能自己手动将这些方法的类型添加上去了,例如上面的代码在 TypeScript 中可以这样写:
定义非 Document 实例类型
mongoose 的 .lean() 方法返回的是一个不是 Document 实例的纯数据,为了与 Document 区分,一开始我的做法是定义两个结构差不多的类型,例如:
上面的例子中,
RawUser
与User
之间唯一的不同就是User
继承了Document
而RawUser
没有,但维护这样两个 interface 很繁琐且容易出错,后来我找到了这样一种写法:社区提供的解决方案
最近发现社区里已经有人针对这个问题提供了一种解决方案:https://github.com/szokodiakos/typegoose
The text was updated successfully, but these errors were encountered: