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