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

Posted

技术标签:

【中文标题】使用 TypeScript 时如何避免两次编写 Mongoose 的 Schema?【英文标题】:How to avoid writing the Schema of Mongoose twice when using it with TypeScript? 【发布时间】:2017-07-12 20:10:30 【问题描述】:

我正在尝试将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”。

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

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

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

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 解决方案?有没有更好的解决方案?

【问题讨论】:

想知道为什么三年后这个问题仍然没有好的答案 【参考方案1】:

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,注重易用性。

【讨论】:

以上是关于使用 TypeScript 时如何避免两次编写 Mongoose 的 Schema?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 jquery 使用 webpack 和 typescript 导入两次?

第2242期TypeScript类型编写指南之下篇

使用异步避免重复代码

Jest typescript 测试运行两次,一次用于 ts 文件,一次用于 js 文件

如何避免重复请求按钮单击两次

当切点在超类上但派生类覆盖时,如何避免两次命中切入点?