如何修复TypeScript错误属性'isBoom'在'Boom <any>类型上不存在| ResponseObject'

时间:2019-01-14 15:30:50

标签: node.js typescript hapijs

以下源代码返回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

  

类型'Boom |不存在属性'isBoom' ResponseObject”。   属性“ isBoom”在“ ResponseObject”类型上不存在。

     

类型'Boom |不存在属性'isServer'   ResponseObject”。属性“ isServer”在类型上不存在   “ ResponseObject”。

     

'string |类型的参数((httpMessage:字符串)=> ResponseObject)'   不可分配给“字符串”类型的参数。键入'(httpMessage:   字符串)=> ResponseObject'不能分配给'string'类型。

我该如何解决? @types/hapi有问题吗?

1 个答案:

答案 0 :(得分:2)

由于response是联合体ResponseObject | Boom | null,因此除非使用类型保护,否则我们只能访问联合体的普通成员。

类型防护类型有几种,您可以详细了解here。下面我根据属性的存在使用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类型保护器也应起作用:

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的情况下,编译器才需要这样做,但是反正还是个好主意。