当前位置: 首页 > 知识库问答 >
问题:

Mongoose的打字方式。。。?

白博易
2023-03-14

正在尝试在Typescript中实现Mongoose模型。搜索Google只发现了一种混合方法(结合JS和TS)。如果没有JS,我们将如何按照我相当天真的方法实现用户类?

希望能够IUserModel没有行李。

import {IUser} from './user.ts';
import {Document, Schema, Model} from 'mongoose';

// mixing in a couple of interfaces
interface IUserDocument extends IUser,  Document {}

// mongoose, why oh why '[String]' 
// TODO: investigate out why mongoose needs its own data types
let userSchema: Schema = new Schema({
  userName  : String,
  password  : String,
  firstName : String,
  lastName  : String,
  email     : String,
  activated : Boolean,
  roles     : [String]
});

// interface we want to code to?
export interface IUserModel extends Model<IUserDocument> {/* any custom methods here */}

// stumped here
export class User {
  constructor() {}
}

共有3个答案

唐经国
2023-03-14

抱歉死尸,但这对某人来说仍然很有趣。我认为Typegoose提供了更现代和优雅的方式来定义模型

以下是文档中的一个示例

import { prop, Typegoose, ModelType, InstanceType } from 'typegoose';
import * as mongoose from 'mongoose';

mongoose.connect('mongodb://localhost:27017/test');

class User extends Typegoose {
    @prop()
    name?: string;
}

const UserModel = new User().getModelForClass(User);

// UserModel is a regular Mongoose Model with correct types
(async () => {
    const u = new UserModel({ name: 'JohnDoe' });
    await u.save();
    const user = await UserModel.findOne();

    // prints { _id: 59218f686409d670a97e53e0, name: 'JohnDoe', __v: 0 }
    console.log(user);
})();

对于现有的连接场景,您可以使用以下内容(在实际情况中可能更为常见,并且在文档中没有提及):

import { prop, Typegoose, ModelType, InstanceType } from 'typegoose';
import * as mongoose from 'mongoose';

const conn = mongoose.createConnection('mongodb://localhost:27017/test');

class User extends Typegoose {
    @prop()
    name?: string;
}

// Notice that the collection name will be 'users':
const UserModel = new User().getModelForClass(User, {existingConnection: conn});

// UserModel is a regular Mongoose Model with correct types
(async () => {
    const u = new UserModel({ name: 'JohnDoe' });
    await u.save();
    const user = await UserModel.findOne();

    // prints { _id: 59218f686409d670a97e53e0, name: 'JohnDoe', __v: 0 }
    console.log(user);
})();
强硕
2023-03-14

如果要分离类型定义和数据库实现,还有另一种选择。

import {IUser} from './user.ts';
import * as mongoose from 'mongoose';

type UserType = IUser & mongoose.Document;
const User = mongoose.model<UserType>('User', new mongoose.Schema({
    userName  : String,
    password  : String,
    /* etc */
}));

灵感来自这里:https://github.com/Appsilon/styleguide/wiki/mongoose-typescript-models

边浩漫
2023-03-14

我是这样做的:

export interface IUser extends mongoose.Document {
  name: string; 
  somethingElse?: number; 
};

export const UserSchema = new mongoose.Schema({
  name: {type:String, required: true},
  somethingElse: Number,
});

const User = mongoose.model<IUser>('User', UserSchema);
export default User;
 类似资料:
  • 问题内容: 据我所知,方法是,那是,并且也喜欢,但它们不是存储在数据库中。 但是,我想知道那是和之间的唯一区别。还有其他我想念的东西吗? 问题答案: 实例方法,静态方法或虚拟方法均未存储在数据库中。方法与虚拟函数之间的区别在于,虚拟函数的访问方式类似于属性,方法的调用方式类似于函数。实例与静态实例与虚拟实例之间没有区别,因为在类上具有可访问的虚拟静态属性是没有意义的,但在类上具有某些静态实用程序或

  • 问题内容: 尝试在Typescript中实现Mongoose模型。对Google的调查只揭示了一种混合方法(结合JS和TS)。在没有JS的情况下,如何以我比较幼稚的方式实现User类呢? 希望能够不带行李的IUserModel。 问题答案: 这是我的方法:

  • 我有两个猫鼬方案,一个用于用户,一个用于帖子。 一个用户可以喜欢许多帖子。 最后,我想在客户端呈现用户喜欢的所有帖子,在一个部分,我可以使用填充()方法,在另一个部分,用户不喜欢的帖子,而不创建喜欢的帖子的副本。 我可以使用un填充()方法只获取不喜欢的帖子吗?如果没有,最好的方法是什么?

  • 问题内容: 我有ObjectId的字符串。 我如何使用它: 创建“评论”模型并分配字符串user_id值或发布时,保存时出现错误。我将所有数据分配给vars。 我尝试: TypeError:对象函数ObjectID(id){ TypeError:无法调用未定义的方法“ ObjectId” TypeError:无法读取未定义的属性“ ObjectId” 当然, 在所有通话之前* ,我还包括了猫鼬 *

  • 我试图在我的模型中添加一个静态方法,但是如果我这样做了,我得到了这个错误:< code >一个接口只能扩展一个类或另一个接口。 这是我的代码: 错误来自

  • 我有一个抽象类,它有一个抽象的泛型方法,看起来像这样 然后我有一个扩展这个抽象类的类。因为是抽象的,所以我必须在子类中实现它。 看起来像这样 返回 我得到以下错误虽然 类型'某物[]'不能分配给类型'T[]'。 我尝试了一些方法来解决这个错误,但是为了让Typescript满意,似乎还必须使子实现通用化。在我从至。 因此,我想知道如何使我的代码与TypeScript 2.4.1兼容?