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
相关产品推荐
相关产品推荐

