【问题标题】:TypeScript Error: Object literal may only specify known properties, and '...' does not exist in type 'DeepPartial<Document>'TypeScript 错误:对象文字只能指定已知属性,并且类型“DeepPartial<Document>”中不存在“...”
【发布时间】:2019-12-03 16:33:49
【问题描述】:

我正在尝试使用 TypeScript 在 NodeJS 中创建一个简单的控制器 API,但是当我为模型分配值时出现错误 ts(2345)

这是我的用户模型

import mongoose, {Schema} from 'mongoose'

const userSchema: Schema = new Schema({
    _id: Schema.Types.ObjectId,
    login: {
        type: String,
        unique: true,
        required: true
    },
    email: {
        type: String,
        unique: true,
        match: (value: string) => /\S+@\S+\.\S+/.test(value),
        required: true
    },
    password: {
        type: String,
        required: true
    },
    createdAt: {
        type: Date,
        default: Date.now
    }
})

export default mongoose.model('User', userSchema)

控制器

import User from '../models/User'
import {Request, Response} from 'express'

export class UserController {

    public addNewUser (req: Request, res: Response) {
        const {login, email, password} = req.body

                // some code

        const newUser = new User({
            // ts error:
            // Argument of type '{ login: any; email: any; 
            // password: any; date: number; }' is not assignable 
            // to parameter of type 'DeepPartial<Document>'.
            // Object literal may only specify known properties, 
            // and 'login' does not exist in type 
            // 'DeepPartial<Document>'.ts(2345)
            login,
            email,
            password,
            date: Date.now()
        })
    }
}

我找到了解决此错误的方法:

const newUser = new User({          
            login,
            email,
            password,
            createdAt: Date.now(),
            ...req.body
        })

但我不确定这是一个好方法,仍然不知道为什么我会收到这个 ts 错误。有什么帮助吗?

【问题讨论】:

    标签: node.js typescript rest api mongoose


    【解决方案1】:

    尝试像这样声明你的模型:

    import * as mongoose, { Schema, Document } from 'mongoose';
    
    export interface IUser extends Document {
      email: string;
      firstName: string;
      lastName: string;
    }
    
    const UserSchema: Schema = new Schema({
      email: { type: String, required: true, unique: true },
      firstName: { type: String, required: true },
      lastName: { type: String, required: true }
    });
    
    // Export the model and return your IUser interface
    export default mongoose.model<IUser>('User', UserSchema);
    

    【讨论】:

    • 模块 '"mongoose"' 没有默认导出。
    • 你必须像这样导入它:import * as mongoose from 'mongoose';
    【解决方案2】:

    问题在于 req.body 没有定义 {login, email, password},这使得它们成为“任何”。 TS 不喜欢它,如果您在需要特定类型时尝试将“任何”添加到对象。您可以将 req 转换为包含正文对象的类型,该对象包含登录名、电子邮件和密码。像这样:

    public addNewUser (req: UserRequest, res: Response) {...}
    

    interface UserRequest {body: {login: string; email: string; password: string}}
    

    【讨论】:

    • 感谢您的回答。不幸的是错误仍然发生:Argument of type '{ login: string; email: string; password: string; date: number; }' is not assignable to parameter of type 'DeepPartial&lt;Document&gt;'. (...)
    猜你喜欢
    • 2019-08-13
    • 1970-01-01
    • 2021-02-18
    • 2021-09-27
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    相关资源
    最近更新 更多