You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:39:06