Typescript typegoose getModelForClass 返回类型

Posted

技术标签:

【中文标题】Typescript typegoose getModelForClass 返回类型【英文标题】:Typescript typegoose getModelForClass return type 【发布时间】: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")

问题

    这怎么可能。如果我查看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.
    如果可以构造 ClipModel 是否意味着 ClipModel 是一个类?如果可以的话,应该可以这样做吗?
class MyCustomModel extends ClipModel 
 // Add some customisations 

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

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

谢谢,

【问题讨论】:

【参考方案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 的更多信息

【讨论】:

以上是关于Typescript typegoose getModelForClass 返回类型的主要内容,如果未能解决你的问题,请参考以下文章

使用多个装饰器将 Type-GraphQL 与 Typegoose 相结合

如何设置 Typegoose

用于 rest api 的 typegoose/mongoose 日期格式

从扩展 Typegoose 并包含静态类型特定方法的父类继承

Mongodb,Typegoose - 通用存储库模式

Typegoose / Mongoose 将自定义类型映射到 db