Свойство «подписка» не существует для типа «void» в приложении Angular - PullRequest
0 голосов
/ 28 апреля 2020

Ниже приведен метод onSendMessage() в моем приложении Angular:

onSendMessage() {
      this.conversationsService.addConversation(this.form.value.message).subscribe(() => {
        this.router.navigateByUrl('conversation-list');
      });
    });
  }

Этот метод принимает сообщение, введенное пользователем, и создает запись в firebase перед перенаправлением пользователя.

Раньше это работало нормально, но я внес некоторые изменения в метод ConversationsService.addConversation() ниже.

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

Свойство «подписка» не существует для типа «void»

Вот это ConversationsService.addConversation():

addConversation(message: string) {
    let generatedId;
    let newConversation: Conversation;
    this.authService.userId.pipe(
      take(1),
      switchMap(userId => {
        newConversation = new Conversation(
          Math.random().toString(),
          userId,
          [new Message(
            Math.random().toString(),
          )]
        );
        return this.http.post<{ name: string }>(
          'firebaseUrl/conversations.json',
          { ...newConversation, id: null }
        );
      }),
      switchMap(resData => {
        generatedId = resData.name;
        return this.conversations;
      }),
      take(1),
      tap(conversations => {
        newConversation.id = generatedId;
        this._conversations.next(conversations.concat(newConversation));
      })
    );
  }

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

Кроме того, вот код AuthService, где я получаю userId:

private _user = new BehaviorSubject<User>(null);

get userId() {
    return this._user.asObservable().pipe(
      map(user => {
        if (user) {
          return user.id
        } else {
          return null;
        }
      })
    );
  }

Ответы [ 2 ]

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

Добавьте ключевое слово return в this.authService.userId.pipe(...)

0 голосов
/ 28 апреля 2020

Точно так же, как писал @Quentin.

Было бы неплохо добавить return type из id, чтобы избежать подобных проблем в будущем.

get userId(): Observable<number | null>, это предполагает тип id - это number. Кроме того, вам может не понадобиться этот оператор if/else. Просто верните user.id, если он не обнуляем.

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