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

如何提取TRPC useQuery返回data的TypeScript类型?

解决TRPC客户端复用服务端Query返回类型的问题

直接使用ReturnType<typeof trpc.promotions.getPromotion.useQuery>['data']得到unknown,是因为useQuery是泛型函数,TypeScript无法自动推断其泛型参数,导致返回类型中的data被标记为unknown。以下是两种可靠的解决方法:

方法一:从服务端Router导出类型并使用TRPC工具类型提取

  1. 服务端导出Router类型
    在服务端的TRPC Router定义文件中,导出整个AppRouter的类型:

    // server/trpc/index.ts
    import { router } from './trpc';
    import { promotionsRouter } from './router/promotions';
    
    export const appRouter = router({
      promotions: promotionsRouter,
    });
    
    // 导出供客户端使用的类型
    export type AppRouter = typeof appRouter;
    
  2. 客户端提取Query返回类型
    在客户端代码中,使用TRPC提供的inferQueryOutput工具类型,从AppRouter中提取目标Query的返回类型:

    // client/types.ts
    import type { AppRouter } from '@/server/trpc';
    import type { inferQueryOutput } from '@trpc/server';
    
    // 提取getPromotion接口的返回类型
    export type Promotion = inferQueryOutput<AppRouter['promotions']['getPromotion']>;
    

    之后在任意组件中,直接导入Promotion类型即可复用:

    import type { Promotion } from '@/client/types';
    
    interface PromotionCardProps {
      promotion: Promotion;
    }
    

方法二:直接从客户端TRPC实例推导类型

如果客户端的TRPC实例是基于AppRouter创建的,也可以直接从实例中推导类型:

import type { inferQueryOutput } from '@trpc/server';
import { trpc } from '@/client/trpc';

type Promotion = inferQueryOutput<typeof trpc.promotions.getPromotion>;

局部复用的简便方法

如果仅在某个组件局部需要复用该类型,可以直接提取已有的promotion变量类型:

const { data: promotion } = trpc.promotions.getPromotion.useQuery({ id: promotionId });
// 使用NonNullable排除undefined,得到服务端返回的真实类型
type Promotion = NonNullable<typeof promotion>;

内容的提问来源于stack exchange,提问作者helion3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 15:45:54