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

猫鼬加载TypeScript的类问题

松和璧
2023-03-14

我正在利用mongoose类模式。

并为我的 Node 项目使用 TypeScript。

为了确保我的模型知道我定义的模式,所以我有自动完成等。

然而,模式类变得更加棘手。正如他们文件中所写的:

loadclass()函数允许您从ES6类中提取方法、静态和虚拟化。类方法映射到模式方法,静态方法映射到模式静态,getters/setters映射到虚拟化。

所以我的代码看起来像:

interface IUser extends mongoose.Document {
  firstName: string,
  lastName: string
};

const userSchema = new mongoose.Schema({
  firstName: {type:String, required: true},
  lastName: {type:String, required: true},
});

class UserClass{
   static allUsersStartingWithLetter(letter: string){
       return this.find({...});
   }
   fullName(this: IUser){
      return `${this.firstName} ${this.lastName}`
   }
}
userSchema.loadClass(UserClass);

const User = mongoose.model<IUser>('User', userSchema);
export default User;

我的目标是TypeScript将理解:

  1. 用户有一个方法allUsersStartingWithLetter
  2. 用户实例有一个方法fullName

在当前配置中,它没有。我自己无法完成。

共有3个答案

尹俊贤
2023-03-14

您的Userclass需要从mongoose扩展Model。您似乎缺少一些为您工作所需的代码。

从您作为参考分享的链接来看,这里有一个指南,可以通过完整的代码示例解决您的问题。

https://stackoverflow.com/a/58107396/1919397

沈皓君
2023-03-14

您考虑过添加<code>扩展mongoose吗。将建模为UserClass

class UserClass extends mongoose.Model<IUser> {
   static allUsersStartingWithLetter(letter: string){
       return this.find({...});
   }
   fullName(this: IUser){
      return `${this.firstName} ${this.lastName}`
   }
}
申博厚
2023-03-14

真的需要用到类吗?我可以使用接口来完成这个任务,而不需要使用类。这里有一个例子:

/* eslint-disable func-names */
import mongoose from 'mongoose';
export interface Foo {
  id?: string;
  name: string;
  createdAt?: Date;
  updatedAt?: Date;
}

export type FooDocument = mongoose.Document & Foo;

const fooSchema = new mongoose.Schema(
  {
    name: { type: String, required: true },
  },
  { timestamps: true }
);

fooSchema.methods.bar = function (): void {
  const foo = this as FooDocument;
  foo.name = 'bar';
};

const FooModel = mongoose.model<FooDocument>('foos', fooSchema);

export default FooModel;

这样,您可以使用Foo接口来处理具有反转相关性的方法。您存储库中的它们将返回<code>Foo</code>而不是FooDocument。。。

额外:如果在数据库请求中使用< code>lean(),则返回的是< code>Foo接口。更多精益信息请点击此处

 类似资料:
  • 问题内容: 我正在尝试验证并保存具有以下结构的Passport配置文件: http://passportjs.org/guide/profile/ 这是我想出的方案: 电子邮件具有名为“ type”的属性,该属性保留用于猫鼬类型。我该如何解决? 问题答案: 您需要使用对象定义字段:

  • 问题内容: 我使用了来自Maven回购的log4j-1.2.17捆绑包。我尝试在捆绑软件中执行此代码(我的捆绑软件调用了log4j-1.2.17捆绑软件) 但是我有错误 捆绑包已按顺序加载 如何解决这个错误?拜托,对不起我的英语。最好的问候,亚瑟。 问题答案: 由于您的Log4j类似乎已由sun.misc类加载器加载,我认为某些东西正在从OSGi外部提供log4j类。有Log4J条目解释了为什么它

  • 问题内容: 我从Mongoose网站上阅读了快速入门,几乎复制了代码,但是无法使用Node.js连接MongoDB。 这是我的代码。控制台仅打印,不打印。我哪里错了? 问题答案: 调用时,它将建立与数据库的连接。 但是,您在以后的某个时间点(处理请求时)附加了事件侦听器,这意味着该连接可能已经处于活动状态,并且该事件已经被调用(您尚未监听它)。 。 您应该重新排列代码,以使事件处理程序尽可能(及时

  • 问题内容: 我目前正在尝试向我的猫鼬模式中添加静态方法,但是我找不到它无法通过这种方式工作的原因。 我的模特: IUser: 如果我现在尝试拨打电话,则会出现以下错误 我知道我没有在任何地方定义方法,但我真的不知道在哪里可以放置它,因为我不能只是将静态方法放到接口中。希望您能帮助我找到错误,在此先感谢! 问题答案: 我认为您遇到了我刚刚遇到的同样问题。您可以拨打此电话。几个教程让您从这样的模型中调

  • 我想解决的是res.Code下面的红线问题 下面是loginApi接口的类型定义: 其中UserType类型的定义: IResponse类型的定义: 为什么Promise的返回值Code,Data,Msg下面都带红线? 代码:

  • 问题内容: 我已经查看了网站上的一些问题,但还没有弄清楚我在做什么错。我有一些这样的代码: 我不确定在中间应该做什么以使其正确更新数据库。我已经尝试了很多东西,但是无法撤消以找出所有我尝试过的东西。我一整夜都花了时间,我希望它能正常工作。 这几乎是我想要的,我想知道是否有任何方法可以在条件部分 我会继续玩弄它。 问题答案: 这正是我想要的,只有一行。:D完美!