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

TRPC链式调用输入解析器丢失类型信息问题求助

TRPC 链式组合输入解析器时丢失类型信息的解决方案

问题出在你给函数参数指定了ProcedureBuilder<any>类型,这直接抹掉了之前步骤的类型上下文,导致后续无法正确合并input的类型。TRPC的ProcedureBuilder是带泛型的,必须保留它的类型参数,才能让.input()方法的类型合并机制正常工作。

修改方案:用泛型保留类型信息

把封装的函数改成泛型函数,让参数的ProcedureBuilder类型被完整保留,这样类型系统就能追踪到input的合并结果:

import { initTRPC } from '@trpc/server';
import { ProcedureBuilder } from '@trpc/server';
import { z } from 'zod';

const t = initTRPC.create();
export const procedure = t.procedure;

// 泛型 T 继承 ProcedureBuilder,保留传入的类型信息
function addAddress<T extends ProcedureBuilder<any>>(a: T) {
    return a.input(z.object({
        address: z.string()
    }))
}

function addPreKey<T extends ProcedureBuilder<any>>(a: T) {
    return a.input(z.object({
        key: z.string()
    }))
}

export const test = addAddress(addPreKey(procedure));
test.query(({ input }) => { 
    input.address; // 类型正常识别
    input.key;     // 不再报错,类型正确
})

原理说明

TRPC的.input()方法内部会自动合并已有的input schema类型,但这个依赖于ProcedureBuilder的泛型参数来传递类型上下文。之前用ProcedureBuilder<any>相当于把所有类型重置为any,类型系统自然无法追踪合并后的input结构。而泛型写法会完整保留每一步的类型信息,让.input()的类型合并逻辑正常运作,和你直接链式调用.input()的效果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:52:10