使用方法扩展猫鼬模式 - 打字稿兼容的方式

问题描述 投票:0回答:2

我发现 mongoose 建议向模式添加其他方法的方式 - 与 typeScript 不兼容:

import * as m from 'mongoose'

const MySchema = new m.Schema({ deletedAt: Date  });

MySchema.methods.myDelete = function() { this.deletedAt = new Date(); }
MySchema.method('myUndelete', function() { this.deletedAt = null; });


const MyModel = m.model('MyCollection', MySchema);

let myInstance = new MyModel();
myInstance.myDelete();
myInstance.myUndelete();

打字稿编译器说

错误 TS2339:类型“Document & Omit<{ deletedAt?: Date; } & { _id: ObjectId; }, never>”上不存在属性“myDelete”。

错误 TS2339:类型“Document & Omit<{ deletedAt?: Date; } & { _id: ObjectId; }, never>”上不存在属性“myUndelete”。

如何实现向Schema添加新方法并同时被Typescript编译器识别?有什么想法吗?

javascript typescript mongodb mongoose mongoose-schema
2个回答
2
投票

遵循TypeScript 中的静态和方法文档。

例如(“猫鼬”:“^7.3.1”

import * as m from 'mongoose';

interface MyDocument {
    deletedAt?: Date;
}

interface MyDocumentMethods {
    myDelete(): void;
    myUndelete(): void;
}

type ModelType = m.Model<MyDocument, {}, MyDocumentMethods>;

const MySchema = new m.Schema<MyDocument>({ deletedAt: Date });

MySchema.methods.myDelete = function () {
    this.deletedAt = new Date();
};
MySchema.method('myUndelete', function () {
    this.deletedAt = null;
});

const MyModel = m.model<MyDocument, ModelType>('MyCollection', MySchema);

let myInstance = new MyModel();
myInstance.myDelete();
myInstance.myUndelete();
myInstance.deletedAt; // ok


0
投票

在我看来,将 typescript 与 mongoose 一起使用并不是非常理想且强类型。在我看来,使用模式选项比创建单独的接口只是为了在模式或模型函数泛型上提供类型要好得多

例如,让我们为聚合器创建一个函数助手。也许您想创建一个函数来帮助您查找更好地控制聚合,而不是使用

populate
函数

import { MongoDatabase } from "@/db/mongoose";
import { PipelineStage, Schema } from "mongoose";

const db = MongoDatabase.instance()
export const Example = db.model('Example', new Schema(
    {
        foo: String
    }, 
    {
        statics: {
            bar: (): PipelineStage[] => {
                return [
                   // do something here
                ]
            }
        }
    }
))

然后我们就可以像这样使用它了

const example = await Example.aggregate([...Example.bar()])
© www.soinside.com 2019 - 2024. All rights reserved.