【问题标题】:Typescript typegoose getModelForClass return typeTypescript typegoose getModelForClass 返回类型
【发布时间】:2021-11-25 09:27:34
【问题描述】:

使用typegoose/mongoose 我可以获得这样的类的模型(其中Clip 是一些将保存到数据库的类)

import { getModelForClass } from '@typegoose/typegoose';
...

const ClipModel = getModelForClass(Clip);

而且这个模型是可构造的,我的意思是我可以做到这一点;

const clip = new ClipModel()
const clip = new ClipModel({someProp: "someValue"})

问题

  1. 这怎么可能。如果我查看getModelForClass 的返回类型,这里是ReturnModelType<U, QueryHelpers>,那么类型怎么会有构造函数呢?这和做不一样吗?
const clip = new ReturnModelType<Clip, QueryHelpers>(); // Ts error: 'ReturnModelType' only refers to a type, but is being used as a value here.
  1. 如果可以构造 ClipModel 是否意味着 ClipModel 是一个类?如果可以的话,应该可以这样做吗?
class MyCustomModel extends ClipModel {
 // Add some customisations 
}

但是,这会产生 ts 错误 Base constructors must all have the same return type.

  1. 是否可以扩展 ClipModel 以在其上添加一些自定义函数,以便可以像这样调用它;
ClipModel.find({}) // the default created find method 
ClipModel.myCustomFind({}) // find method with custom stuff

谢谢,

【问题讨论】:

    标签: typescript mongodb mongoose typegoose


    【解决方案1】:

    是否可以扩展 ClipModel 以在其上添加一些自定义函数,以便可以像这样调用它;

    您要搜索的是static methods

    如果可以构造 ClipModel 是否意味着 ClipModel 是一个类?如果可以的话,应该可以做到吗?

    ClipModel(在运行时从getModelForClass返回)是mongoose.Model的一个实例,在JS中不能扩展实例

    这怎么可能。如果我在这里查看 getModelForClass 的返回类型,它是 ReturnModelType 那么类型如何具有构造函数?这和做不一样吗?

    你可以阅读更多关于ReturnModelType的文档

    你的例子也很奇怪,一个类型不能在运行时使用,正确的是:

    type TCustomModel = ReturnModelType<typeof Class>;
    // and if you have QueryHelpers for the Class
    type TCustomModel = ReturnModelType<typeof Class, ClassQueryHelpers>
    
    // and then later
    const CustomModel: TCustomModel = getModelForClass(Class);
    // or (pseudo code, may need more more types in ".model<>")
    const CustomModel: TCustomModel = mongoose.model('Name', schema);
    

    @queryMethod 中阅读有关QueryHelpers 的更多信息

    【讨论】:

      猜你喜欢
      • 2021-08-01
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      相关资源
      最近更新 更多