Fastify搭配TypeScript使用时路由handler泛型类型不兼容报错
问题根因
这个TypeScript类型错误是泛型参数不匹配导致的:
你在路由配置中直接使用了不带泛型参数的默认RouteOptions类型,该默认类型对应的请求体(Body)类型为unknown,和你handler函数中明确定义的request.body: IGenerateQRCode类型不兼容,TS校验时发现handler参数类型和RouteOptions约定的类型不匹配,就抛出了该错误。
解决方案
你可以任选以下一种方式修复:
方案1:给RouteOptions传入匹配的泛型参数(类型最严谨,推荐)
修改路由配置文件,给generateQrCode路由对应的RouteOptions传入Body类型泛型,让类型定义和handler的参数要求对齐:
import { RouteOptions } from "fastify"; import pingServer from "../controllers/pingServer"; import generateQRCode from "../controllers/generateQrCode"; // 导入自定义的Body类型 import { IGenerateQRCode } from "../types/IGenerateQRCode"; const ping: RouteOptions = { method: "GET", url: "/ping", handler: pingServer, }; // 传入泛型,声明该路由的请求体类型 const generateQrCode: RouteOptions<{ Body: IGenerateQRCode; }> = { method: "POST", url: "/generate", handler: generateQRCode, }; // 注意原代码的routes数组漏加了generateQrCode路由,需要补上 const routes = [ping, generateQrCode]; export default routes;
修改后RouteOptions约定的handler类型和你实际实现的handler参数类型完全一致,类型错误会直接消失。
方案2:利用TS自动类型推导,减少重复类型声明
如果你不想在路由配置处重复写泛型定义,可以去掉单个路由对象上的RouteOptions标注,让TS自动根据handler推导类型,最后在导出路由数组时统一做类型校验:
import { RouteOptions } from "fastify"; import pingServer from "../controllers/pingServer"; import generateQRCode from "../controllers/generateQrCode"; const ping = { method: "GET", url: "/ping", handler: pingServer, } as const; const generateQrCode = { method: "POST", url: "/generate", handler: generateQRCode, } as const; // 统一校验数组内所有路由配置符合RouteOptions规范 const routes: RouteOptions[] = [ping, generateQrCode]; export default routes;
这种写法不需要重复声明请求类型,代码更简洁,同时能保留类型校验能力。
内容的提问来源于stack exchange,提问作者0xMukesh
相关产品推荐
相关产品推荐

