尽管我不确定是否可行,但我正在尝试在Mongoose中设置toObject
方法的返回类型。
使用泛型,可以设置从Mongoose查询返回的Document
对象的属性,但是这些对象的getter和setter通常在访问时运行许多验证代码,这就是我在某些情况下想避免。
那些Document
对象具有toObject
方法,该方法返回等效的匿名对象,这是我正在使用的匿名对象,但是那些返回的对象具有any
类型。我想在Schema
或Model
定义中设置这些对象的类型,因此我不必在每次查询时都使用类型断言。
当前我的代码如下:
import mongoose, { Schema, Document } from 'mongoose'
interface User {
username: string,
email: string,
password: string,
}
const UserSchema = new Schema({
username: { type: String, required: true },
email: { type: String, required: true },
password: { type: String, required: true },
})
const UserModel = mongoose.model<User & Document>('User', UserSchema)
export { User, UserModel }
这样,我可以使用以下代码执行查询:
const userDocument = await UserModel.findById(id)
const userObj = userDocument && userDocument.toObject()
尽管userDocument
的类型为User extends Document
,而userObj
的类型为any
。我想将其设置为User
类型。
答案 0 :(得分:0)
可悲的是,在Mongoose中,toObject方法的类型为“ any”,这意味着唯一的选择就是增加“ toObject”方法并覆盖类型。或用冒号键入userObj。
这是猫鼬键入中toObject的签名。
SELECT CategoryId,
MAX( CASE seq WHEN 1 THEN ProductName ELSE '' END ) + ', ' +
MAX( CASE seq WHEN 2 THEN ProductName ELSE '' END ) + ', ' +
MAX( CASE seq WHEN 3 THEN ProductName ELSE '' END ) + ', ' +
MAX( CASE seq WHEN 4 THEN ProductName ELSE '' END )
FROM ( SELECT p1.CategoryId, p1.ProductName,
( SELECT COUNT(*)
FROM NORTHWND.dbo.Products p2
WHERE p2.CategoryId = p1.CategoryId
AND p2.ProductName <= p1.ProductName )
FROM NORTHWND.dbo.Products p1 ) D ( CategoryId, ProductName, seq )
GROUP BY CategoryId ;
简单的解决方法是做到这一点...
toObject(options?: DocumentToObjectOptions): any;
希望这会有所帮助,我知道这不是一个“理想”的解决方案,但是我想说一下Typescript gitter或DefinitelyTyped猫鼬团队,让他们在内部修复打字问题。
让我知道是否还有其他事情。