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 相结合
用于 rest api 的 typegoose/mongoose 日期格式