Fastify添加preHandler等opts属性后req.body类型变为unknown,求解决方案
Fastify中添加preHandler后req.body类型变为unknown的解决方法
问题原因
在Fastify中使用ZodTypeProvider时,若给路由opts参数添加preHandler或其他非schema属性,TypeScript的类型推断会失效——因为Fastify的类型推导依赖于对opts对象结构的精准识别,额外属性会干扰推导逻辑,导致req.body退化为unknown类型。
解决方法
以下三种方案均无需手动调用zod.parse,可完整保留类型安全验证机制:
1. 显式指定路由类型参数
直接给.post方法传入类型参数,明确req.body的类型:
.withTypeProvider<ZodTypeProvider>() .post<{ Body: z.infer<typeof createTrackValidator>; Request: { user: { id: string } }; // 若需要req.user的类型也可在此定义 }>('/', { preHandler: [authRequired], schema: { body: createTrackValidator } }, (req) => { return trackService.createTrack(req.body, req.user.id); });
2. 利用Zod类型工具提取类型
借助fastify-type-provider-zod提供的FromSchema工具,从schema中直接提取类型:
import type { FromSchema } from 'fastify-type-provider-zod'; type CreateTrackBody = FromSchema<typeof createTrackValidator>; .withTypeProvider<ZodTypeProvider>() .post<{ Body: CreateTrackBody }>('/', { preHandler: [authRequired], schema: { body: createTrackValidator } }, (req) => { return trackService.createTrack(req.body, req.user.id); });
3. 固定opts对象的字面量类型
将opts对象单独定义并添加as const,帮助TypeScript保留完整结构信息以完成推断:
const routeOpts = { preHandler: [authRequired], schema: { body: createTrackValidator } } as const; .withTypeProvider<ZodTypeProvider>() .post('/', routeOpts, (req) => { return trackService.createTrack(req.body, req.user.id); });
内容的提问来源于stack exchange,提问作者Gabriel Nadaleti
相关产品推荐
相关产品推荐

