Mongoose 和 TypeScript - 类型“IEventModel”上不存在属性“_doc”

typescript

1个回答

写回答

jamesk19

2025-06-25 06:15

+ 关注

JS
JS

Mongoose 是一个在 Node.JS 环境下操作 MongoDB 数据库的非常流行的工具。它提供了一种简单而灵活的方式来定义数据模型和进行数据库操作。而 typescript 是一种强类型的 JavaScript 超集,它可以在开发过程中提供类型检查和更好的代码提示,帮助开发者避免一些常见的错误。然而,当我们在使用 Mongoose 和 typescript 结合开发时,可能会遇到一些类型相关的问题。

在 Mongoose 中,我们可以通过定义模型来描述数据的结构和行为。模型是 Mongoose 中的一个核心概念,它是对数据库集合的一种抽象。通过模型,我们可以定义数据的字段、类型、默认值、校验规则等信息。同时,模型还提供了许多方便的方法来进行数据的 CRUD 操作。

在 typescript 中,我们可以使用接口来定义数据的类型。通过接口,我们可以明确指定每个字段的类型,并在开发过程中进行类型检查。这样可以提高代码的可靠性和可维护性。

然而,当我们将 Mongoose 和 typescript 结合使用时,可能会遇到一个常见的问题,即类型“IEventModel”上不存在属性“_doc”。这个问题通常在使用查询方法(如 find、findOne 等)返回结果时出现。原因是 typescript 并不知道 Mongoose 在查询结果中添加了一个特殊属性“_doc”,该属性包含了查询到的文档数据。

为了解决这个问题,我们可以通过在接口中添加一个索引签名来告诉 typescript,我们允许模型具有任意的属性。这样 typescript 就不会报错了。下面是一个示例代码:

typescript

import { Document, Schema, model } from 'mongoose';

interface IEvent {

name: string;

date: Date;

}

interface IEventModel extends IEvent, Document {}

const eventSchema = new Schema<IEventModel>({

name: {

type: String,

required: true

},

date: {

type: Date,

required: true

}

});

const Event = model<IEventModel>('Event', eventSchema);

async function getEvents(): Promise<IEventModel[]> {

return Event.find();

}

async function createEvent(event: IEvent): Promise<IEventModel> {

return Event.create(event);

}

// 使用示例

(async () => {

const events = awAIt getEvents();

console.log(events);

const newEvent = awAIt createEvent({

name: 'Party',

date: new Date()

});

console.log(newEvent);

})();

在上面的示例代码中,我们定义了一个名为 IEvent 的接口来描述事件的数据结构,包含了 name 和 date 两个字段。然后我们通过扩展 Document 接口来定义了一个新的接口 IEventModel,它继承了 IEvent 的字段,并且拥有了 Document 的属性。

接下来,我们使用 Schema 来定义了一个事件的数据模式,并将 IEventModel 作为泛型参数传入。然后使用 model 方法创建了一个名为 Event 的模型。

最后,我们定义了两个异步函数 getEvents 和 createEvent 来进行数据库操作。在 getEvents 函数中,我们使用 Event.find() 方法来查询所有事件,并返回一个事件模型的数组。在 createEvent 函数中,我们使用 Event.create() 方法创建一个新的事件,并返回创建的事件模型。

在使用示例中,我们通过调用 getEvents 函数来获取所有事件,并打印出结果。然后通过调用 createEvent 函数来创建一个新的事件,并打印出创建的事件模型。

通过以上的示例代码,我们可以看到,在定义接口时通过扩展 Document 接口来解决类型问题,从而使 Mongoose 和 typescript 能够很好地配合使用。这样可以确保我们在开发过程中能够获得更好的类型检查和代码提示,提高开发效率和代码质量。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号