我是 TypeScript 的新手。
我一直在寻找优雅的模式来使用 TypeScript 定义 Mongoose 模式。我一直在研究 Nicholas Mordecai 的一篇文章:
https://know-thy-code.com/mongoose-schemas-models-typescript/
这是一个非常有帮助的(感谢尼古拉斯)!尽管有一些我无法深入了解的编码约定。第一个与以下代码块有关...
import { Schema, model, Document, Model } from 'mongoose';
declare interface IContact extends Document{
name: string;
email: string;
phone?: string;
message?: string;
course_enquiry?: string;
creation_date: Date;
}
export interface ContactModel extends Model<IContact> {};
让我困惑的具体一点是:
"Model<IContact> {};"
当然,我什至看不到生成的 js 代码,因为接口没有被转译。
ContactModel 扩展了 IContact,但仅在 IContact 被重新断言/强制转换(从 Mongoose 文档)到 Mongoose 模型之后。我在这里假设正确吗?让我难过的只是代码约定......
"Class<interface> {};"
实际上做到了/实现了!
第二个问题与以下代码有关,Nicholas 已将其包含在与上述相同的 ts 文件中:
export class Contact {
private _model: Model<IContact>;
constructor() {
const schema = new Schema({
name: { type: String, required: true },
email: { type: String, required: true },
phone: { type: String },
message: { type: String },
course_enquiry: { type: String },
creation_date: { type: Date, default: Date.now }
});
this._model = model<IContact>('User', schema);
}
public get model(): Model<IContact> {
return this._model
}
}
我希望在这里得到帮助的一点是评估者获取方法......
public get model(): Model<IContact> {
return this._model
}
我了解获取评估者的原则,但我不确定“model():”之后的代码是否返回 this._model 的函数或实例(或两者)?
此外,在单独的 ts 控制器文件中,Nicholas 使用以下两段代码来使用上述...
import { connect, connection, Connection } from 'mongoose';
import { Contact, ContactModel } from './../models/contactsModel';
declare interface IModels {
Contact: ContactModel;
}
this._models = {
Contact: new Contact().model
// this is where we initialise all models
}
注意。this._models 被定义为“private _models: IModels;”
我真的很想具体详细地了解这段代码在做什么!我的解释是正在创建一个新的 Contact 对象,然后它使用 get 评估器方法 model(),该方法返回一个 IContact 接口(转换/断言为模型)?
非常感谢任何帮助!
非常感谢。