[英]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 會明白:
User
有一個方法allUsersStartingWithLetter
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
。 您似乎缺少一些必需的代碼來使這項工作為您服務。
從您作為參考共享的鏈接中,這里有一個指南,應該可以通過完整的代碼示例解決您的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.