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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:06:21