【问题标题】:How to achieve strongly typed static schema functions using Mongoose with Typescript?如何使用 Mongoose 和 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;

最后:

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

【问题讨论】:

    标签: node.js mongodb typescript mongoose


    【解决方案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');
    

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-18
      • 2021-10-17
      • 2020-04-24
      • 1970-01-01
      • 2020-06-16
      • 2017-07-15
      • 2013-05-24
      • 2021-03-18
      相关资源
      最近更新 更多