在使用 TypeScript 时如何避免编写 Mongoose 的 Schema 两次?

Zsw*_*Zsw 5 javascript mongoose typescript mongoose-schema typescript2.0

我正在尝试将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);
Run Code Online (Sandbox Code Playgroud)

我们可以Foo像这样使用:

Foo.someStaticMethod();
var foo = new Foo();
foo.someInstanceMethod();
foo.name;
Run Code Online (Sandbox Code Playgroud)

-

然而,现在我们有了 TypeScript,我们将收到错误消息:

类型“Model”上不存在属性“someStaticMethod”。

类型“文档”上不存在属性“someInstanceMethod”。

类型“文档”上不存在属性“名称”。

经过一番研究,我发现解决这个问题的方法是声明以下接口:

export interface IFooDocument extends mongoose.Document {
  name: string;
  value: number;
  someInstanceMethod(): any;
}

export interface IFooModel extends mongoose.Model<IFooDocument> {
  someStaticMethod(): any;
}
Run Code Online (Sandbox Code Playgroud)

并调整Foo为:

export const Foo = <IFooModel>mongoose.model<IFooDocument>('Foo', fooSchema);
Run Code Online (Sandbox Code Playgroud)

-

我对这种方法的问题是,我们本质上需要重写模式两次 - 一次在fooSchema,一次在接口上。对我来说,必须确保接口和模式始终保持同步的必要性带来的问题与类型检查解决的问题一样多。

所以我的问题是:有没有办法避免重写架构两次并仍然使用类型?有没有更好的方法来保持架构和界面同步?

或者,如果我使用 TypeScript,也许 Mongoose 不是正确的 ODM 解决方案?有更好的解决方案吗?

Mar*_*ika 0

Or alternatively, perhaps Mongoose is not the right ODM solution if I am using TypeScript? Is there a better solution?

我很乐意为您提供这个库:https ://github.com/doublemcz/mongo-odm

它基于 Native Client,注重易用性。