Как исправить ошибку TypeScript Свойство 'isBoom' не существует для типа 'Boom <any>| ResponseObject» - PullRequest
0 голосов
/ 14 января 2019

Следующий исходный код возвращает ошибки TypeScript:

this.hapi.ext({
  type: 'onPreResponse',
  method: async (request, handler) => {
    if (request.response.isBoom && request.response.message !== 'Invalid request payload input') {
      if (request.response.isServer) {
        logger.captureException(request.response, null, {
          digest: this.requestDigest(request)
        });
      } else {
        logger.captureMessage(request.response.message, 'info', null, {
          digest: this.requestDigest(request)
        });
      }
    }
    return handler.continue;
  }
});

enter image description here

Свойство 'isBoom' не существует для типа 'Boom | ResponseObject. Свойство isBoom не существует для типа ResponseObject.

Свойство 'isServer' не существует для типа 'Boom | ResponseObject. Свойство isServer по типу не существует 'ResponseObject'.

Аргумент типа 'строка | ((httpMessage: string) => ResponseObject) ' нельзя назначить параметру типа 'строка'. Введите '(httpMessage: string) => ResponseObject 'нельзя назначить типу' string '.

Как я могу их исправить? Есть проблема с @types/hapi?

1 Ответ

0 голосов
/ 14 января 2019

Поскольку response является объединением ResponseObject | Boom | null, мы можем получить доступ только к общим членам объединения, если только мы не используем type-guard.

Существует несколько типов охранников типа, и вы можете больше узнать о здесь . Ниже я использую охрану типа in для дискриминации на основе существования свойства

import { Server } from 'hapi';

const hapi = new Server({})

hapi.ext({
    type: 'onPreResponse',
    method: async (request, handler) => {
        if (request.response && 'isBoom' in request.response && request.response.message !== 'Invalid request payload input') {
            if (request.response.isServer) {
                request.response.message // string 
            }
            return handler.continue;
        }
    }
});

Поскольку тип Boom является классом, instanceof typeguard также должен работать:

hapi.ext({
    type: 'onPreResponse',
    method: async (request, handler) => {
        if (request.response && request.response instanceof Boom && request.response.message !== 'Invalid request payload input') {
            if (request.response.isServer) {
                request.response.message // string 
            }
            return handler.continue;
        }
    }
});

Примечание в обоих случаях я добавил проверку для request.response, чтобы исключить null из объединения. Это требуется только компилятору, если strictNullChecks включено, но в любом случае может быть хорошей идеей.

...