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 _
相关产品推荐
相关产品推荐

