RxJS v6.3 pipe - как его использовать? - PullRequest
0 голосов
/ 05 сентября 2018

Я только что создал новое приложение Angular, которое установило новую версию RxJS v6.3 (выпущенную 6 дней назад), которая «исправила» проблему с конвейером и строгой типизацией.

С v6.2 я мог бы указать только окончательное возвращаемое значение канала (в данном случае .pipe<User>, например:

getStatus(): Observable<User> {
  return this.http.get('/user/status')
    .pipe<User>(
      tap(foo, bar),
      finalize(() => this.requestEnded()),
      map((resp) => new User(resp.user)));
}

Но в новой версии они удалили эту возможность в классе Observable (они исправили эту строку от v6.2.2 до этой в v6.3 ). IDE жалуется на это сообщение:

Ожидается не менее 0 аргументов, но получено 1 или более.

Теперь я вынужден указывать типы для каждой функции в конвейере, что-то вроде этого:

getStatus(): Observable<User> {
  return this.http.get('/user/status')
    // If I have 3 piped functions I have to specify all 3 types
    .pipe<{}, {}, User>(
      tap(foo, bar),
      finalize(() => this.requestEnded()),
      // I even have to specify type for this parameter (resp)
      map((resp: {user}) => new User(resp.user))); 
}

Это действительно было задумано? Обратите внимание, что это «исправление» для pipe, для меня это означает, что pipe всегда должен был работать так. Или я использую это неправильно?

У меня даже была эта функция, которая работала хорошо, я просто передал некоторые "общие каналы", которые я хотел выполнить для каждого запроса:

logIn(username: string, password: string, remember: boolean) {
  return this.http.post('/user/login', { username, password, remember })
    .pipe<User>(
      ...this.commonPipes(),
      map(resp => new User(resp.user)));
}

Но теперь, как мне указать типы для этого?

Это изменение было введено в v6.3 , которое говорит, что оно "исправляет" некоторую ошибку с pipe (оно ссылается на эту проблему ). Я пишу "исправления", потому что для меня это сломало вещи, оно не имеет обратной совместимости, и я не нашел руководства "Как обновить", которое объясняет, как использовать новое исправленное pipe().

1 Ответ

0 голосов
/ 06 сентября 2018

Проблема заключалась в том, что распространенный синтаксис можно было использовать только в нескольких версиях, в которых подписи для pipe были «фиксированными». Однако эти «исправления» по существу нарушили все проверки типов для pipe, что было намного хуже, поэтому они были отменены и снова изменены.

Как отмечалось в этой проблеме , для использования синтаксиса распространения с pipe требуется TypeScript 3.0 - поскольку он поддерживает извлечение и распространение параметров кортежа.

В качестве альтернативы тому, чтобы commonPipes возвращал массив операторов, вы могли бы рассмотреть использование статической функции pipe для объединения операторов в один оператор, который затем можно передать наблюдаемому методу pipe.

Взгляните на мою статью Операторы объединения Статья.

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