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

TypeScript中扩充Koa中间件自定义UserInfo类型不生效如何解决

TypeScript扩充Koa中间件类型不生效的解决方法

你当前的写法是在第二个模块中重新定义了一个同名的UserInfo接口,不属于对第一个中间件导出接口的模块扩充,因此不会触发TS的接口合并规则,新增属性自然无法生效。

步骤1:编写模块扩充声明

第二个中间件的类型定义不需要显式导入后重新导出同名接口,而是通过模块扩充语法修改原模块的类型:

// 先引入原模块,触发模块扩充的作用域
import 'first-middleware';

declare module 'first-middleware' {
  // 对原模块导出的UserInfo做接口合并
  export interface UserInfo {
    inPasList?: {
      [K: string]: boolean
    }
  }
}

// 如果你是直接将属性挂载在Koa的Context对象上,还可以同步扩充Koa的上下文类型
declare module 'koa' {
  interface DefaultContext {
    userInfo: import('first-middleware').UserInfo
  }
}

不需要额外修改http模块的原声明,原IncomingMessage中引用的UserInfo会自动继承合并后的完整类型。

步骤2:调整tsconfig配置

确保你写的扩充类型文件被TS加载,需要在tsconfig.json的include字段中包含类型文件所在目录,比如你的类型文件存放在src/typings/目录下,配置如下:

{
  "include": [
    "src/**/*",
    "src/typings/**/*"
  ]
}

验证效果

完成上述操作后,你可以直接访问ctx.req.oaUserInfo?.inPasList或者ctx.userInfo?.inPasList,TS不会报类型错误,属性会被正确识别。

内容的提问来源于stack exchange,提问作者GonlyK _

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:06:03