以下源代码返回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”在“ ResponseObject”类型上不存在。
类型'Boom |不存在属性'isServer' ResponseObject”。属性“ isServer”在类型上不存在 “ ResponseObject”。
'string |类型的参数((httpMessage:字符串)=> ResponseObject)' 不可分配给“字符串”类型的参数。键入'(httpMessage: 字符串)=> ResponseObject'不能分配给'string'类型。
我该如何解决? @types/hapi
有问题吗?
答案 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
的情况下,编译器才需要这样做,但是反正还是个好主意。