0

我是 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 接口(转换/断言为模型)?

非常感谢任何帮助!

非常感谢。

4

1 回答 1

0

Model<IContact>中,您会看到一个Generic Class在此处查看有关它们的文档。

在 C# 和 Java(以及 tsc)等语言中,工具箱中用于创建可重用组件的主要工具之一是泛型,也就是说,能够创建一个可以在多种类型而不是单一类型上工作的组件。这允许用户使用这些组件并使用他们自己的类型。

泛型类具有与泛型接口相似的形状。泛型类在类名称后面的尖括号 (<>) 中有一个泛型类型参数列表。

就像接口一样,将类型参数放在类本身可以让我们确保类的所有属性都使用相同的类型。

于 2020-07-24T11:05:15.417 回答