我正在尝试将Mongoose与TypeScript结合使用。
仅使用JavaScript,我们就可以轻松地为模型Foo
编写模式。
const fooSchema = new mongoose.Schema({
name: String,
value: Number
});
fooSchema.methods.someInstanceMethod = function() {/*...*/};
fooSchema.statics.someStaticMethod = function() {/*...*/};
const Foo = mongoose.model('Foo', fooSchema);
我们可以这样使用Foo
:
Foo.someStaticMethod();
var foo = new Foo();
foo.someInstanceMethod();
foo.name;
-
但是,现在我们有了TypeScript,我们将收到错误消息:
属性'someStaticMethod'在'Model'类型上不存在。
属性'someInstanceMethod'在'Document'类型中不存在。
“文件”类型中不存在属性“名称”。
经过一些研究,我收集到了解决这个问题的方法是声明以下接口:
export interface IFooDocument extends mongoose.Document {
name: string;
value: number;
someInstanceMethod(): any;
}
export interface IFooModel extends mongoose.Model<IFooDocument> {
someStaticMethod(): any;
}
并将Foo
调整为:
export const Foo = <IFooModel>mongoose.model<IFooDocument>('Foo', fooSchema);
-
我对这种方法的问题是我们基本上需要重写Schema两次 - 一次在fooSchema
上,一次在接口上。对我来说,必须确保接口和模式始终保持同步的必要性引入了与类型检查解决方案一样多的问题。
所以我的问题是:有没有办法避免重写Schema两次仍然使用类型?有没有更好的方法来保持架构和界面同步?
或者,如果我使用TypeScript,也许Mongoose不是正确的ODM解决方案?有更好的解决方案吗?