Проверить тип объекта, возвращаемого Observable в Angular? - PullRequest
0 голосов
/ 05 августа 2020

Я создаю приложение Angular, которое отправляет вызовы API. Это один из методов AuthService (отвечает за аутентификацию пользователя):

login(loginForm: UserLoginRequest): Observable<AuthenticationResponse | TfaResponse> {
    return this.http.post<AuthenticationResponse | TfaResponse>('api/auth/login', loginForm);
}

Эти методы возвращают Observable с одним из следующих ответов:

export class AuthenticationResponse {
    token: string;
    refreshToken: string;
}

export class TfaResponse {
    requiresTwoFactor: boolean;
    isTwoFactorConfigured: boolean;
}

Затем я подписываюсь на этот Observable в мой компонент и я хотим выполнять разные действия в зависимости от типа ответа:

this.authService.login(userLoginForm)
    .subscribe(
      (result) => {
        // type of result is AuthenticationResponse
        if (*type check*) {
            // action with AuthenticationResponse
        }
        // type of result is TfaResponse
        else if (*type check*) {
            // action with TfaResponse
        }
      },
    );

В данный момент я просто проверяю, владеет ли объект некоторыми свойствами из этого класса, например:

this.authService.login(userLoginForm)
        .subscribe(
          (result) => {
            if ('token' in result) {
                // action with AuthenticationResponse
            }
            else if ('requiresTwoFactor' in result) {
                // action with TfaResponse
            }
          },
        );

Но я понимаю, что это определенно плохое решение, которое развалится после первого изменения в классе AuthenticationResponse или TfaResponse. Как мне проверить класс в этом случае?

1 Ответ

0 голосов
/ 05 августа 2020

Вы можете использовать ключевое слово instanceof для проверки типов.

if (result instanceof AuthenticationResponse) {
  .....
} else if (result instanceof TfaResponse) {
  .....
}
...