Я только что создал новое приложение 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()
.