【问题标题】:How to fix TypeScript error Property 'isBoom' does not exist on type 'Boom<any> | ResponseObject'如何修复 TypeScript 错误属性“isBoom”在类型“Boom<any> 上不存在”|响应对象'
【发布时间】:2019-06-08 14:44:32
【问题描述】:

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

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

“Boom | 类型”上不存在属性“isServer” 响应对象'。类型上不存在属性“isServer” '响应对象'。

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

我该如何修复它们? @types/hapi有问题吗?

【问题讨论】:

  • 试试isBoom in request.response而不是request.response.isBoom
  • 感谢您的建议@TitianCernicova-Dragomir。不工作。 TypeScript 错误:“in”表达式的左侧必须是“any”、“string”、“number”或“symbol”类型。
  • 对不起,我的意思是'isBoom' in request.response
  • @ritaj 你的建议看起来很有希望!将在这里报告以确认。

标签: node.js typescript hapijs


【解决方案1】:

由于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 时编译器才需要这样做,但无论如何这可能是个好主意。

【讨论】:

  • 感谢您花时间分解它。
猜你喜欢
  • 2020-02-24
  • 1970-01-01
  • 2018-02-02
  • 2020-03-25
  • 2018-09-27
  • 1970-01-01
  • 2021-06-19
  • 2021-11-12
  • 2020-02-22
相关资源
最近更新 更多