如何扩展body-parser的IncomingRequest类型添加rawBody属性?
问题原因
你写的类型声明不生效,核心是三个问题:
- 模块声明写法错误:
declare module http没有给模块名加引号,TS会把它识别为自定义全局命名空间,不会关联到Node.js内置的http模块类型 - 类型合并逻辑错误:扩展已有类型需要用
interface做声明合并,你写的export class IncomingMessage会被识别为全新的独立类型,不会给原有类型追加属性 - 未确认TS扫描范围:如果
types.d.ts没有被tsconfig.json的include配置覆盖,TS根本不会加载这个声明文件
解决步骤
- 检查
tsconfig.json的include配置,确保你的声明文件在扫描范围内,比如常见配置:
{ "include": ["src/**/*", "types/**/*", "*.d.ts"] }
如果types.d.ts放在项目根目录,上面配置里的*.d.ts就会覆盖到它。
- 替换
types.d.ts里的内容,同时扩展Express Request和http IncomingMessage类型,既兼容express.json配置中verify回调的赋值场景,也适配后续路由、其他中间件里读取rawBody的场景:
declare global { namespace Express { interface Request { rawBody?: Buffer; } } } declare module 'http' { interface IncomingMessage { rawBody?: Buffer; } }
注意:如果你的声明文件顶部存在import/export语句成为ES模块,上面的写法可直接使用;如果是无导入导出的纯全局声明文件,去掉外层的
declare global包裹即可。
- 清除TS服务缓存,写完声明后重启TS语言服务,比如VSCode中按快捷键
Ctrl+Shift+P(macOS为Cmd+Shift+P),选择TypeScript: Restart TS Server即可生效。
效果验证
修改完成后,原有express.json配置中的req.rawBody = buf赋值不会再报Property 'rawBody' does not exist on type 'IncomingMessage'.ts(2339)错误,后续在路由处理函数、其他自定义中间件中读取req.rawBody时,TS也能正常识别为Buffer类型。
内容的提问来源于stack exchange,提问作者itaied
相关产品推荐
相关产品推荐

