【问题标题】:Mongoose typings, id property not availableMongoose 类型,id 属性不可用
【发布时间】:2017-04-26 07:19:46
【问题描述】:

我为我的猫鼬 TypeScript 模型使用了以下代码。

import mongoose = require('mongoose')

export interface PieceInterface extends mongoose.Document {
  date: Date
  summary: string
  source: string
  link: string
}

export const PieceSchema = new mongoose.Schema({
  date: { type: Date, default: new Date(), required: true },
  summary: { type: String, default: 'summary', required: true },
  source: { type: String, default: 'source', required: true },
  link: { type: String, default: '#', required: true }
})

export const Piece = mongoose.model<PieceInterface>('Piece', PieceSchema)

现在,当我使用 Piece.find({}).then(x =&gt; {...}) 时,x 就像预期的那样是 Promise&lt;PieceInterface[]&gt;

但是,我无法获得

Piece.find({}).then(x => {
  console.log(x[0].id)
})

要正确编译,它总是告诉我error TS2339: Property 'id' does not exist on type 'PieceInterface'

因为,PieceInterface 扩展了 mongoose.Document,所以我看起来...

interface Document extends MongooseDocument, NodeJS.EventEmitter, ModelProperties

然后,

class MongooseDocument implements MongooseDocumentOptionals 

最后是这个,

interface MongooseDocumentOptionals {
  id?: string;
}

在我看来,它应该可以工作。我可以使用MongooseDocumentModelProperties 提供的变量,但不能使用MongooseDocumentOptionals

我缺少什么吗?

参考:mongoose.d.ts 来自 GitHub

Definition of document

Definition of MongooseDocument

Definition of MongooseDocumentOptionals

【问题讨论】:

    标签: node.js typescript mongoose typescript-typings


    【解决方案1】:

    Mongo 中 ID 的默认字段名称是 _id 而不是 id,所以你应该这样做:

    Piece.find({}).then(x => {
      console.log(x[0]._id)
    })
    

    【讨论】:

    • 但是mongoose默认有一个虚拟的idgetter,我想这就是为什么MongooseDocumentOptional的类型定义包含id
    【解决方案2】:

    我的朋友,

    使用这种机制,

    import mongoose = require('mongoose')
    
    export interface PieceInterface extends mongoose.Document {
      id : mongoose.Types.ObjectId //Add this line
      date: Date
      summary: string
      source: string
      link: string
    }
    
    export const PieceSchema = new mongoose.Schema({
      date: { type: Date, default: new Date(), required: true },
      summary: { type: String, default: 'summary', required: true },
      source: { type: String, default: 'source', required: true },
      link: { type: String, default: '#', required: true }
    })
    
    export const Piece = mongoose.model<PieceInterface>('Piece', PieceSchema)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-12
      • 2022-08-18
      • 2018-03-09
      • 2021-11-24
      • 2019-12-01
      • 1970-01-01
      • 2019-11-05
      • 2017-07-15
      相关资源
      最近更新 更多