Как исправить правило no-unsafe-any? - PullRequest
0 голосов
/ 18 сентября 2018

Я использую TSLint , чтобы связать мой код Angular TypeScript.Я включил правило no-unsafe-any, так как мне кажется хорошим правилом никогда не предполагать ничего о свойствах типа any.

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

public intercept(request: HttpRequest<{}>, next: HttpHandler): Observable<HttpEvent<{}>> {
  return next
    .handle(request)
    .pipe(
      catchError(error => {
        if (error && error.status === httpCodeUnauthorized) {
          // Auto logout if unathorized
          this.authenticationService.logout();
        }

        const errorMessage = (error.error && error.error.message) || error.statusText;

        return throwError(errorMessage);
      }),
    );
}

Linter сообщает о 4 ошибках в 2 строки:

ERROR: /home/robert/programming/npc/gui/src/app/core/authentication/unauthorized.interceptor.ts[24, 24]: Unsafe use of expression of type 'any'.
ERROR: /home/robert/programming/npc/gui/src/app/core/authentication/unauthorized.interceptor.ts[29, 33]: Unsafe use of expression of type 'any'.
ERROR: /home/robert/programming/npc/gui/src/app/core/authentication/unauthorized.interceptor.ts[29, 48]: Unsafe use of expression of type 'any'.
ERROR: /home/robert/programming/npc/gui/src/app/core/authentication/unauthorized.interceptor.ts[29, 72]: Unsafe use of expression of type 'any'

2 проблемных строки:

  • if (error && error.status === httpCodeUnauthorized) {
  • const errorMessage = (error.error && error.error.message) || error.statusText;

Корень проблемы в том, что error аргумент обработчика передан catchError ( библиотечная функция Rxjs ) имеет тип any.Я понимаю, что error может быть любого типа, поэтому небезопасно предполагать, что у него есть какие-либо определенные свойства, но я сначала проверяю наличие этих свойств, прежде чем ссылаться на них, что мне кажется безопасным.

Что можно / нужно сделать, чтобы убедить компилятор linter / TypeScript в безопасности и передать правило?

Ответы [ 2 ]

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

В случае Angular ошибка всегда должна иметь тип HttpErrorResponse

catchError((error: HttpErrorResponse) => {
//...
}

Тем не менее, в вашем коде вы смотрите на error.error, который определен как any в HttpErrorResponse, поэтому вам, вероятно, следует использовать тип guard для проверки и приведения его к объекту Error. Не нужно определять Error - его должны определять базовые типы машинописи.

function isError(value: any | undefined): value is Error {
  return error && ((error as Error).message !== undefined);
}

затем используйте его в

const errorMessage = isError(error.error) ? error.error.message : error.statusText;
0 голосов
/ 18 сентября 2018

У вас есть два варианта, когда вы знаете , что error всегда имеет определенный тип, вы можете просто аннотировать тип. Если вы не уверены, вы можете использовать охрану типа .

Тип аннотации

С аннотацией типа вы можете просто сообщить компилятору, что вы ожидаете, что error будет определенного типа. С таким подходом вы можете полностью избежать ввода типа any:

interface Error {
    status: string,
    statusText: string,
    error: { message: string | undefined } | undefined;
}

catchError((error: Error | undefined) => {
    //...
}

Тип охраны

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

function isError(value: any | undefined): value is Error {
    return error && ((error as Error).status !== undefined);
}

catchError(error => {
    if (isError(error)) {
        //Inside this block, error will be of type Error
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...