Почему карта не работает после обновления RxJS до v6.3

У меня есть случай, аналогичный описанному в этом посте.

У меня есть служба входа в систему, которая (среди прочего) проверяет, действителен ли токен пользователя. Ответ сервера определяется в интерфейсе:

export interface UserVerifyResponse {
    success: boolean
}

Моя цель состояла в том, чтобы создать наблюдаемый объект, который будет возвращать логическое значение в зависимости от того, проверен ли пользователь. Этот код работал с RxJS v6.2:

authenticate(): Observable<boolean> {
    return this.http.get<boolean>(
        this.apiUrl+'/verify_user'
    ).pipe(
        map<UserVerifyResponse, boolean>((receivedData: UserVerifyResponse) => {
            return receivedData.success;
        }),
        tap((data: boolean) => {console.log("User authenticated", data)}),
        catchError(this.handleError)
    )
}

Однако теперь, когда я обновил RxJS до версии 6.3, я получаю эту ошибку:

ERROR in src/app/login/user.service.ts(50,13): error TS2345: Argument of type 'OperatorFunction<UserVerifyResponse, boolean>' is not assignable to parameter of type 'OperatorFunction<boolean, boolean>'.
  Type 'UserVerifyResponse' is not assignable to type 'boolean'.

Это меня беспокоит, потому что я использую этот подход сопоставления ответа API с внутренним классом или примитивом (в другом месте у меня есть служба, которая использует http.get<T>), и теперь мне интересно, следует ли мне принудительно использовать RxJS 6.2 или есть простой способ миграции до 6.3. Я могу переписать их все, как описано в ответе на вышеупомянутый пост, но я хочу вернуть логическое значение, и мой подход, на мой взгляд, выглядит более ясным.

Какие-либо предложения?


person george007    schedule 10.11.2018    source источник
comment
Этим this.http.get<boolean> вы говорите, что этот запрос вернет Observable, излучающий booleans. Но тогда вы используете map<UserVerifyResponse, boolean>, где UserVerifyResponse - это объект вместо boolean.   -  person martin    schedule 10.11.2018
comment
Потому что это то, что я хочу, чтобы запрос вернул. С помощью RxJS v6.2 я смог перевести ответ, который я получил от API (типа UserVerifyResponse), в boolean, так что, наконец, http.get вернет Observable типа boolean. Почему раньше это было приемлемо, а теперь - неправильная логика?   -  person george007    schedule 10.11.2018


Ответы (1)


Видимо, улучшили проверку типов.

Когда вы написали this.http.get<boolean>, вы говорите, что "этот get возвращает Observable логического типа", что не то, что вы имеете в виду. Get возвращает Observable типа UserVerifyResponse, и вы должны так сказать:

authenticate(): Observable<boolean> {
    return this.http.get<UserVerifyResponse>(
        this.apiUrl+'/verify_user'
    ).pipe(
        map((receivedData) => {
            return receivedData.success;
        }),
        tap((data) => {console.log("User authenticated", data)}),
        catchError(this.handleError)
    )
}

Канал изменяет Observable с UserVerifyResponse на boolean, который в конечном итоге возвращается.

Обратите внимание, что я удалил большую часть вашего набора текста. Как правило, вам следует указывать тип только в следующих случаях:

  • вы должны, как и в случае с самим get(), поскольку компилятор TypeScript не может правильно определить тип, или
  • вы пишете общедоступную функцию, как в случае с authenticate(), поскольку, хотя TypeScript может сделать вывод о типе, кто-то, читающий ваш код позже, вероятно, не сможет.
person Malvolio    schedule 10.11.2018