设置toObject方法的返回类型

时间:2019-06-14 01:34:32

标签: typescript mongoose

尽管我不确定是否可行,但我正在尝试在Mongoose中设置toObject方法的返回类型。

使用泛型,可以设置从Mongoose查询返回的Document对象的属性,但是这些对象的getter和setter通常在访问时运行许多验证代码,这就是我在某些情况下想避免。

那些Document对象具有toObject方法,该方法返回等效的匿名对象,这是我正在使用的匿名对象,但是那些返回的对象具有any类型。我想在SchemaModel定义中设置这些对象的类型,因此我不必在每次查询时都使用类型断言。

当前我的代码如下:

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类型。

1 个答案:

答案 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猫鼬团队,让他们在内部修复打字问题。

让我知道是否还有其他事情。