【问题标题】:Mongoose Types.Array throwing error while saving new document - TypescriptMongoose Types.Array 在保存新文档时抛出错误-Typescript
【发布时间】:2022-02-05 15:32:19
【问题描述】:
export interface User {
  roles: mongoose.Types.Array<string>,
}

/* user schema */
const schema = new mongoose.Schema<User>({
   roles: {type: [String], required: true}
})

const Users = mongoose.model<User>("user", schema);

现在,如果我使用 find 获取文档,我会得到 roles 数组($push、$pop、$addToSet 等)的特定于猫鼬数组的 IntelliSense。

但是在保存新文档时,打字稿抱怨说角色数组is missing the following properties from type 'Array&lt;string&gt;': $pop, $shift, addToSet, isMongooseArray, and 5 more.

const newUser: User = { roles: ['abc','xyz'] }
new Users(newUser).save();

我可以这样写save:

new Users({roles: ['abc,xyz']).save();

错误就会消失。但是我在保存新文档时完全放弃了代码完成。如何在保存包含没有$push, $pop etc 属性的数组的新文档时使 TS 抑制警告?

【问题讨论】:

  • 它可以很好地保存文档,但是对于使用 find 获取的文档,我放弃了智能感知
  • 你是说随着那个改变,当你尝试对Users.find({ roles: { $in: ['abc'] } }) 或类似的东西做时,你从 TypeScript 得到错误?
  • 或者你是说你迭代它们时的文档没有数组属性?也许更新您的问题以显示您正在执行的查询以及您尝试对结果执行的操作。
  • 例如,如果我获取一个文档,const userFound = Users.findOne({...})、userFound.roles.$pop 根据 TS 将是未定义的(如果我选择 string[]),但它($pop)确实存在。
  • 不确定您所说的 userFound.roles.$pop 是指谁。运算符 $pop 将用于像 updateOne 这样的操作。对于push 之类的东西,您可以简单地执行userFound.roles.push('whatever'),将其视为普通数组,然后根据docs 保存(查看数组示例)。你好像指的是update statements比如$set、$push等

标签: typescript mongoose


【解决方案1】:
import {AnyKeys, AnyObject} from "mongoose";

type BaseDoc<T> = AnyKeys<T> & AnyObject;

使用 BaseDoc 会在定义对象时抑制 TS 警告。

const newUser: BaseDoc<User> = { roles: ['abc','xyz'] }

查询返回的文档也将具有 mongoose 数组运算符的智能感知功能。

【讨论】:

    猜你喜欢
    • 2014-01-10
    • 1970-01-01
    • 2015-06-11
    • 2021-04-09
    • 2021-04-16
    • 2022-01-22
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多