Strapi+TypeScript中Middleware与Controller的ctx参数类型及报错问题
Strapi + TypeScript:中间件/控制器ctx参数的正确类型指定
你遇到的问题根源是用了Koa原生的Context类型,而Strapi对Koa的Context做了扩展,添加了badRequest、notFound等自定义响应方法,这些方法的类型定义并不在Koa的类型包中,所以TypeScript会报错。
正确的做法是导入Strapi官方提供的Context类型:
1. 导入Strapi的Context类型
直接从@strapi/strapi包中导入Context,这个类型包含了Strapi对Koa Context的所有扩展:
import { Context } from '@strapi/strapi';
2. 修正中间件代码
把你的中间件代码中的ctx类型替换为Strapi的Context,同时可以优化next参数的类型(用Promise<void>替代Promise<any>更严谨):
// path: ./src/api/[api-name]/middlewares/my-middleware.ts import { Context } from '@strapi/strapi'; export default async (ctx: Context, next: () => Promise<void>) => { const newName = ctx.request.body.name; if (!newName) { // 现在TypeScript会正确识别badRequest的多参数签名 return ctx.badRequest('name is missing', { foo: 'bar' }); } await next(); };
3. 控制器中的ctx类型
控制器里的ctx参数同样使用这个Context类型,示例如下:
// path: ./src/api/[api-name]/controllers/[api-name].ts import { Context } from '@strapi/strapi'; export default { async find(ctx: Context) { ctx.body = await strapi.service('api::[api-name].[api-name]').find(); }, async create(ctx: Context) { const data = ctx.request.body; // 可以正常使用ctx.badRequest等Strapi扩展方法 if (!data.title) { return ctx.badRequest('Title is required'); } ctx.body = await strapi.service('api::[api-name].[api-name]').create({ data }); }, };
为什么Koa的Context不行?
Strapi在底层基于Koa开发,但对Koa的Context做了大量扩展,比如:
- 自定义响应方法:
badRequest、notFound、forbidden等,这些方法支持额外的参数(比如错误详情对象) - 附加属性:
strapi实例、state扩展等
Koa原生的Context类型并没有包含这些扩展定义,所以TypeScript无法识别,进而抛出参数不匹配的错误。
内容的提问来源于stack exchange,提问作者user3532505
相关产品推荐
相关产品推荐

