Hapi+TypeScript无类型断言:如何正确处理req.payload与req.pre类型?
为Hapi框架中的req.payload和req.pre添加类型定义的正确方式
我来帮你搞定这个Hapi类型定义的问题!在使用@types/hapi的时候,完全不用总靠类型断言来处理req.payload和req.pre的类型,通过TypeScript泛型+自定义接口就能优雅实现类型安全。下面是针对你给出的示例的完整解决方案:
第一步:定义核心类型接口
先明确请求负载和pre处理结果的结构,用自定义接口做类型约束:
// 定义POST请求的Payload结构 interface ExamplePayload { name: string; } // 定义pre阶段处理后挂载到req.pre的数据结构 interface ExamplePre { example: { msg: string; }; }
第二步:给路由配置添加泛型约束
Hapi的server.route方法支持通过泛型指定当前路由的请求相关类型,把刚才定义的接口传进去,TypeScript就能自动推导req.payload和req.pre的类型:
import { Server, Request } from '@hapi/hapi'; const server = new Server({ port: 3000 }); server.route<{ Payload: ExamplePayload; Pre: ExamplePre; }>({ method: 'POST', path: '/example', options: { pre: [ { assign: 'example', method: (req) => { // 这里req.payload会自动提示name属性,类型完全安全 return { msg: `Mr. ${req.payload.name} Example` }; }, }, ], }, handler: (req) => { // req.pre.example.msg也会有准确的类型提示,不会出现类型报错 return { success: true, info: req.pre.example.msg }; }, });
可选优化:抽离路由配置
如果觉得直接在server.route里加泛型不够清晰,也可以把路由配置抽成变量,提前指定ServerRoute泛型:
import { ServerRoute } from '@hapi/hapi'; const exampleRoute: ServerRoute<{ Payload: ExamplePayload; Pre: ExamplePre; }> = { method: 'POST', path: '/example', options: { pre: [ { assign: 'example', method: (req) => { return { msg: `Mr. ${req.payload.name} Example` }; }, }, ], }, handler: (req) => { return { success: true, info: req.pre.example.msg }; }, }; server.route(exampleRoute);
这样处理后,不仅能获得完整的IDE代码提示,TypeScript还会帮你检查所有类型不匹配的问题——比如不小心把req.payload.name写成req.payload.username时,会直接抛出错误,比类型断言靠谱多了。
内容的提问来源于stack exchange,提问作者user3369753
相关产品推荐
相关产品推荐

