Почему карта не работает после обновления RxJS до v6.3 - PullRequest
0 голосов
/ 10 ноября 2018

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

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

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 до v6.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. Я могу переписать их все, как описано в ответе на вышеупомянутый пост, но я хочу вернуть логическое значение, и мой подход, на мой взгляд, выглядит более ясным.

Есть предложения?

1 Ответ

0 голосов
/ 10 ноября 2018

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

Когда вы пишете this.http.get<boolean>, вы говорите, что «этот get возвращает возвращаемый Observable типа boolean», что означает не , что вы имеете в виду. 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)
    )
}

Канал изменяет Наблюдаемое с UserVerifyResponse на boolean, которое в конечном итоге возвращается.

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

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