javascript - 使用 Mongoose 和 Typescript,接口(interface)的 ref 字段应该使用什么类型?

标签 javascript mongoose

我正在使用 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我们需要考虑的字段可以采用三种形式的值:
  • StringObjectId , 当传递给 create()方法
  • ObjectId从 Mongoose 返回时
  • ICat 的实例从 Mongoose 返回时,使用 populate()

  • 有没有一种方法可以指定接口(interface)可以支持的类型,而不必求助于 any ?

    顺便说一句,我们分开了 IMouseIMouseDB ,因为 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/

    相关文章:

    mongodb - $elem匹配和更新

    javascript - 对象字段序列

    javascript - addEventListener 和数组内部的值递减问题

    mongodb - $in 需要一个数组作为第二个参数

    MongoDB:自动捕获数据库(而不是应用程序)中的创建/更新时间

    node.js - Node 错误: Cannot find module - typescript api for custom module where I export mongoose schemas and interfaces

    IF 语句中的 Javascript 对象声明

    JavaScript选择自己的冒险游戏随机数函数循环问题

    javascript - 为什么 innerHTML 无法通过 AJAX 处理响应文本中的 Html 元素?

    Typescript Mongoose 在 VS Code 中获取架构字段的 IntelliSense 或警告