如何使用 Mongoose 和 Typescript 实现强类型静态模式函数?

Posted

技术标签:

【中文标题】如何使用 Mongoose 和 Typescript 实现强类型静态模式函数?【英文标题】:How to achieve strongly typed static schema functions using Mongoose with Typescript? 【发布时间】:2019-11-26 17:17:11 【问题描述】:

我想知道在使用 TypeScript 时,为 Mongoose Schemas 实现强类型静态函数的最佳方法是什么。

我现在有一个解决方案,但是如果必须为每个模式完成它,它会感觉很乱,并且会添加很多额外的代码。我将在这篇文章的底部展示它,但首先会展示当前的设置:

我有以下接口:

interfaces/Player.ts

export interface Player 
  name: string
  password: string


export interface PlayerDocument extends Player, Document 
   // statics
   findByName(name: string): any
;

我在这里有两个界面的原因是因为我希望能够在没有 Mongoose 绑定的情况下使用 Player 界面以及应用程序中的其他地方。这里的 PlayerDocument 代表 schema-ready 接口,我们将在这里使用它:

schemas/Player.ts


const playerSchema = new mongoose.Schema(
  name:   type: String, required: true, unique: true ,
  password: String,
);

// Not using arrow functions because they prevent binding this. 
// See mongoose-docs
playerSchema.statics.findByName = function(name: string) 
  return this.find( name: new RegExp(name, 'i') );


interface test 
  findByName(name: string): any


export default mongoose.model<PlayerDocument>('Player', playerSchema);

这里的问题是,每当我现在在应用程序的其他地方使用架构时,我都没有得到类型中存在的静态函数 findByName(name: string): any

app.ts

import PlayerSchema from './schemas/Player';
const test = async () => 
    const x = await PlayerSchema.findByName('Erlend');
    console.log(x);

这给出了:

我的解决方案,看起来很老套

我通过创建以下组合类型设法解决了这个问题:

schemas/Player.ts

interface test 
    findByName(name: string): any

type something = mongoose.Model<PlayerDocument> & test;
export default (mongoose.model<PlayerDocument>('Player', playerSchema)) as something;

最后:

但如上所述,我觉得应该有更好的方法.. 想法?

【问题讨论】:

【参考方案1】:

将您的模型输入移动到您的界面:

export interface Player 
  name: string;
  password: string;


export interface PlayerModel extends Model<Player & Document> 
   findByName: (name: string) => any;

现在当你创建模型时,给它两种类型:文档和模型:

const playerModel = model<Player, PlayerStatics>('Player', playerSchema);

playerModel.findByName('foo');

另见:

https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/mongoose#static-methods https://***.com/a/45675548/11255107

【讨论】:

以上是关于如何使用 Mongoose 和 Typescript 实现强类型静态模式函数?的主要内容,如果未能解决你的问题,请参考以下文章

typeScrip 类

如何使用用户名和密码连接 mongodb(mongoose)?

如何在不创建 Mongoose 模型的情况下将 GraphQL 与 Mongoose 和 MongoDB 一起使用

如何使用 graphql 和 mongoose 进行突变

如何在 NestJs 和 typescript 中使用 `mongoose-delete` 插件?

如何将 Mongoose 与 GraphQL 和 DataLoader 一起使用?