Как решить findIndex не является ошибкой функции в Typescript? - PullRequest
0 голосов
/ 17 апреля 2020

В моем приложении Angular я храню массив объектов Message в объекте Conversation.

Мне удалось добавить новый Message в жестко запрограммированном * 1006. * с кодом ниже:

private _conversations = new BehaviorSubject<Conversation[]>([]);

get conversations() {
    return this._conversations.asObservable();
}

addMessageToConversation(conversationId: string, message: string) {
    return this.conversations.pipe(
      take(1),
      tap(conversations => {
        const updatedConversationIndex = conversations.findIndex(convo => convo.id === conversationId);
        const updatedConversations = [...conversations];
        const convoToUpdate = updatedConversations[updatedConversationIndex]; 
        convoToUpdate.messages.push(
          new Message(
            Math.random().toString(),
            message,
          )
        );
        this._conversations.next(updatedConversations);
      })
    );
  }

Я внес следующие изменения в этот метод, чтобы я мог обновить объект в базе данных Firebase:

addMessageToConversation(conversationId: string, message: string) {
    let updatedConversations: Conversation[];
    return this.conversations.pipe(
      take(1), switchMap(conversations => {
        console.log(conversations);
        const updatedConversationIndex = conversations.findIndex(convo => convo.id === conversationId);
        updatedConversations = [...conversations];
        const convoToUpdate = updatedConversations[updatedConversationIndex];
        convoToUpdate.messages.push(
          new Message(
            Math.random().toString(),
            message,
          )
        );
        return this.http.put(
          `myUrl/conversations/${conversationId}.json`,
          { ...convoToUpdate, id: null }
        );
      }), tap(() => {
        this._conversations.next(updatedConversations);
      })
    );
  }

Но теперь, когда я вызываю это метод, я получаю эту консольную ошибку:

разговор.FindIndex не является функцией

Эта ошибка связана с этой строкой кода:

const updatedConversationIndex = conversations.findIndex(convo => convo.id === conversationId);

Кроме того, когда я console.log(conversations) внутри switchMap, это регистрируется:

{id: "-M52u0Fwdt5a9xE0wwCk", userId: "user3", mechanicId: "user2", messages: Array (1)}

Может кто-нибудь сказать мне, почему это происходит, и какие изменения необходимы, чтобы это работало?

1 Ответ

1 голос
/ 17 апреля 2020

Если вы уверены, что conversations является массивом, вы можете просто установить его тип на any

...
switchMap((conversations: any) => {
     const updatedConversationIndex = conversations.findIndex(convo => convo.id === conversationId);
     updatedConversations = [...conversations];
...

Или даже лучше создать тип для него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...