TypeScript报错Cannot find namespace P,pino-http的P.Logger类型无法识别
错误原因
你代码中手动声明logger: P.Logger时使用的P命名空间不存在,@types/pino-http的类型定义中引用的pino类型没有默认注册为全局P命名空间,因此TS编译器无法识别该类型声明。
解决步骤
- 第一步:从pino包中导入Logger类型
在文件顶部添加导入语句:
import type { Logger } from 'pino';
如果你的TS版本不支持import type语法,直接用普通导入即可:
import { Logger } from 'pino';
- 第二步:替换你代码中的类型声明
把const logger: P.Logger = req.log;替换为:
const logger: Logger = req.log;
补充:全局注入req.log类型(可选)
如果你不想每次使用req.log都手动声明类型,可以在项目中添加类型声明文件express.d.ts,扩展Express的Request类型:
import type { Logger } from 'pino'; declare global { namespace Express { interface Request { log: Logger; } } }
添加后你可以直接使用req.log,不需要额外做类型声明,TS会自动识别类型。
修正后的完整代码示例
import express, { NextFunction, Request, Response } from 'express'; import pino from 'pino-http'; import type { Logger } from 'pino'; const app = express(); const port = 8080; app.use(pino()); app.use(async (req: Request, res: Response, next: NextFunction): Promise<void> => { const logger: Logger = req.log; const myClass = new MyClass(logger) })
内容的提问来源于stack exchange,提问作者Matias
相关产品推荐
相关产品推荐

