繁体   English   中英

如何使用带Typescript的Mongoose实现强类型的静态模式功能?

[英]How to achieve strongly typed static schema functions using Mongoose with Typescript?

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

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

我有以下界面:

interfaces/Player.ts

export interface Player {
  name: string
  password: string
}

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

我在这里有两个界面的原因是因为我希望能够在没有Mongoose绑定以及应用程序其他位置的情况下使用Player界面。 这里的PlayerDocument表示架构就绪接口,我们将在这里使用它:

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该类型中存在的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;

最后,Aand:

代码提示出现

但是如上所述,我觉得应该有更好的方法。

将模型输入移动到界面:

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');

也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM