【发布时间】: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