我正在使用 mongoose 和 Typescript,我想知道在创建接口(interface)时应该将什么类型或类型用于引用字段?考虑以下两个相关的接口(interface):
interface ICat {
name: string,
colour: string,
}
interface ICatDB extends ICat, Document {};
interface IMouse {
name: string,
colour: string,
chasedBy: /* ... */
}
interface IMouseDB extends IMouse, Document {};
以及使用它们的模式和模型:
let cat = new Schema({
name: String,
colour: String,
});
mongoose.model<ICatDB>('Cat', cat);
let mouse = new Schema({
name: String,
colour: String,
chasedBy: { type: Schema.Types.ObjectId, ref: 'Cat' }
});
mongoose.model<IMouseDB>('Mouse', mouse);
对于
chasedBy
我们需要考虑的字段可以采用三种形式的值:String
或 ObjectId
, 当传递给 create()
方法ObjectId
从 Mongoose 返回时 ICat
的实例从 Mongoose 返回时,使用 populate()
有没有一种方法可以指定接口(interface)可以支持的类型,而不必求助于
any
?顺便说一句,我们分开了
IMouse
和 IMouseDB
,因为 Typescript 想要 Document
的所有字段每次新建IMouse
时填写对象,所以这是一个解决方法。
最佳答案
至少对于 5.x 版,你可以使用这个:
https://mongoosejs.com/docs/5.x/docs/typescript/populate.html
import { PopulatedDoc } from 'mongoose';
import ICat from './ICat';
interface IMouse {
name: string,
colour: string,
chasedBy: PopulatedDoc<ICat>
}
6.x 中的文档显示了不同的方法:https://mongoosejs.com/docs/typescript/populate.html
像这样:
MouseModel.findOne({}).populate<{chasedBy: ICat}>('chasedBy');
关于javascript - 使用 Mongoose 和 Typescript,接口(interface)的 ref 字段应该使用什么类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60939005/