簡體   English   中英

ZCCADCDEDB567ABAE643E15DCF0974E503Z loadClass 問題與 TypeScript

[英]Mongoose loadClass issue with TypeScript

我正在利用 mongoose class 模式

並將 TypeScript 用於我的 Node 項目。

我已經按照Mongoose Typescript 的方式......? 確保我的 Model 知道我定義的架構,所以我已經自動完成等。

然而,使用模式 class 變得更加棘手。 正如他們的文檔中所寫:

loadClass() function 允許您從 ES6 class 中提取方法、靜態和虛擬。 一個 class 方法映射到一個模式方法,一個 static 方法映射到一個模式 static,getter/setter Z101Z8DC8ED51245 到 virtualsEEAE5824444。

所以我的代碼看起來像:

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. User有一個方法allUsersStartingWithLetter
  2. User實例有一個方法fullName

在當前配置中它沒有。 我自己無法完成。

真的需要使用類嗎? 我可以使用接口來完成此操作,而無需使用類來完成。 這是一個例子:

/* 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接口用於具有反轉依賴性的方法。 它們在您的存儲庫中將返回Foo而不是 FooDocument ...

額外:如果您在數據庫請求中使用lean() ,您將完全返回Foo接口。 更多關於精益的信息在這里

您是否考慮將extends mongoose.Model添加到UserClass

class UserClass extends mongoose.Model<IUser> {
   static allUsersStartingWithLetter(letter: string){
       return this.find({...});
   }
   fullName(this: IUser){
      return `${this.firstName} ${this.lastName}`
   }
}

您的UserClass需要從mongoose擴展Model 您似乎缺少一些必需的代碼來使這項工作為您服務。

從您作為參考共享的鏈接中,這里有一個指南,應該可以通過完整的代碼示例解決您的問題。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM