类型“文档”缺少类型中的以下属性

Posted

技术标签:

【中文标题】类型“文档”缺少类型中的以下属性【英文标题】:Type 'Document' is missing the following properties from type 【发布时间】:2020-04-09 16:59:00 【问题描述】:

所以我有一个 Node /w Typescript REST API,我有一个注册方法,它创建一个用户并使用创建的用户 firstName、lastName、email 进行响应。

问题是我遇到了这个打字稿错误,上面写着“类型'文档'缺少来自类型'SavedUser'的以下属性:名字,姓氏,电子邮件”。

我相信在我的 SavedUser 界面中添加 mongoose.Document 类型会有所帮助,我不确定,谢谢您的帮助!

错误截图:

示例代码:

    interface SavedUser 
        firstName: string 
        lastName: string
        email: string
    

    ...

    public async signUp(req: Request, res: Response): Promise<void | Response> 
        const salt: string = await bcrypt.genSalt(10)
        const hashedPassword: string = await bcrypt.hash(req.body.password, salt)

        const user = new User(
            firstName: req.body.firstName,
            lastName: req.body.lastName,
            email: req.body.email,
            password: hashedPassword
        )

        try 
            const  firstName, lastName, email : SavedUser = await user.save()

            return res.status(200).send(
                firstName,
                lastName,
                email
            )
         catch (err) 
            return res.status(400).send(err)
        
    

【问题讨论】:

user.save() 返回什么? 【参考方案1】:

我不知道问题到底出在哪里,但这就是我使用 TypeScript 创建猫鼬模式的方式,它对我有用。

import * as mongoose from 'mongoose';

interface SavedUserDocument extends mongoose.Document 
    firstName: string;
    lastName: string;
    email: string;


const SavedUserSchema = new mongoose.Schema(...);
export const SavedUser = mongoose.model<SavedUserDocument>('saveduser', SavedUserSchema);

希望它也对你有用。

【讨论】:

【参考方案2】:

Mongoose 在 .save() 上返回更多,然后您当前使用 SavedUser 界面指定。

从 Mongoose 获取所有类型的最简单方法是使用导出的 Document 并扩展您的界面。

import  Document  from 'mongoose';

export interface SavedUser extends Document 
  email: string;
  firstName: string;
  lastName: string;

【讨论】:

【参考方案3】:

感谢您的回答,我解决了!我混合了dijkstra 和phw 的答案并想出了这个:

在我的用户模型中

//user.ts

import  Schema, model, Document  from 'mongoose'

const userSchema = new Schema(
    firstName: 
        type: String,
        required: true,
        min: 2,
        max: 255
    ,

    lastName: 
        type: String,
        required: true,
        min: 2,
        max: 255
    ,

    email: 
        type: String,
        required: true,
        unique: true,
        min: 6,
        max: 255
    
)

export interface SavedUserDocument extends Document 
    firstName: string;
    lastName: string;


export const userSchemaModel = model<SavedUserDocument>('User', userSchema)

现在在我的用户控制器上:

//user.ts

import  userSchemaModel, SavedUserDocument  from '../../models/user/user'
...
    public async signUp(req: Request, res: Response): Promise<void | Response> 
        const user = new userSchemaModel(
            firstName: req.body.firstName,
            lastName: req.body.lastName,
            email: req.body.email
        )

        try 
            const  firstName, lastName : SavedUserDocument = await user.save()

            return res.status(200).send(
                firstName,
                lastName,
                message: 'User created'
            )
         catch (err) 
            return res.status(400).send(err)
        
    
...

我确实有一个问题;

如果我删除了model&lt;SavedUserDocument&gt;('User', userSchema) 中的&lt;SavedUserDocument&gt;,我仍然会收到错误消息,我可以对此有一个很好的解释吗?我对 Typescript 还是比较陌生,希望能得到解释,非常感谢!

【讨论】:

以上是关于类型“文档”缺少类型中的以下属性的主要内容,如果未能解决你的问题,请参考以下文章

与 Typescript 反应 - 类型 缺少类型中的以下属性

如何修复 Typescript 中的“以下属性中缺少类型''...”错误?

array.push 缺少类型中的以下属性

类型“订阅”缺少类型“可观察<StringMap<any>>”中的以下属性

VS Code 中的 Vue Array Prop JSDoc TypeScript 错误:“ArrayConstructor”类型缺少“MyCustomType []”类型中的以下属性

类型“未知 []”缺少“初始状态”类型的以下属性