如何使用 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 实现强类型静态模式函数?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用用户名和密码连接 mongodb(mongoose)?
如何在不创建 Mongoose 模型的情况下将 GraphQL 与 Mongoose 和 MongoDB 一起使用