首页 > 解决方案 > 根据打字稿,Mongo $push 运算符不接受对象:“没有重载匹配此调用”

问题描述

我想用 Mongoose/Mongo 将消息推送到数组中。打字稿声称:

没有重载匹配此调用。重载 1 of 3, '(id: any, update: UpdateQuery, options: QueryOptions & { rawResult: true; }, callback?: ((err: any, doc: FindAndModifyWriteOpResultObject, res: any) => void) | undefined) : any',给出以下错误。输入'{消息:{消息:字符串;作者ID:字符串;}; }' 不可分配给类型 'PushOperator<_AllowStringsForIds<Pick<Pick<_LeanDocument, string | 号码 | 符号>,字符串 | 号码 | 符号>>>'。输入'{消息:{消息:字符串;作者ID:字符串;}; }' 不可分配给类型 'NotAcceptedFields<_AllowStringsForIds<Pick<Pick<_LeanDocument, string | 号码 | 符号>,字符串 | 号码 | 符号>>,只读任何[]>'。属性“消息”与索引签名不兼容。

这是代码片段:

    const conversation = await Conversation.findByIdAndUpdate(
      conversationId,
      {
        $push: { messages: { message, authorId } },
        lastMessage: {
          authorId,
          snippet: `${message.substring(0, 47)}...`,
          read: false,
        },
      },
      { new: true }
    );

由于这个,构建崩溃。如何解决?

标签: node.jsmongodbtypescript

解决方案


这是类型不对齐的问题。

我的理解是,推送操作只能在之前代码中某个点显式定义为数组的字段上完成。

一个潜在的解决方案是显式设置集合的类型以包含您想要的字段(无论如何这是一个好习惯)。

所以,而不是类似的东西

const Conversations = database.collection('conversations');

您将明确定义“对话”文档的架构,然后键入集合:

import { Collection } from 'mongodb';
//...
type Conversation = {
  messages: { message: String, authorId: Number }[],
//...
}

const Conversations: Collection<Conversation> = database.collection('conversations');

推荐阅读