类型推断
非官方测试版翻译
本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
在客户端访问 API 的类型信息通常很有价值。为此,您可以直接从 AppRouter 中推断出包含的类型。
@trpc/server 提供以下辅助类型,帮助从你的 @trpc/server 路由器导出的 AppRouter 中推断这些类型:
-
inferRouterInputs<TRouter> -
inferRouterOutputs<TRouter> -
inferProcedureInput<TProcedure> -
inferProcedureOutput<TProcedure> -
inferSubscriptionInput<TProcedure> -
inferSubscriptionOutput<TProcedure>
输入输出类型推断
假设我们有以下示例路由:
server.tstsimport {initTRPC } from '@trpc/server';import {z } from "zod";constt =initTRPC .create ();constappRouter =t .router ({post :t .router ({list :t .procedure .query (() => {// imaginary db callreturn [{id : 1,title : 'tRPC is the best!' }];}),byId :t .procedure .input (z .string ()).query ((opts ) => {// imaginary db callreturn {id : 1,title : 'tRPC is the best!' };}),create :t .procedure .input (z .object ({title :z .string (),text :z .string (), })).mutation ((opts ) => {// imaginary db callreturn {id : 1, ...opts .input };}),onPostAdd :t .procedure .input (z .object ({authorId :z .string () })).subscription (async function* ({input }) {// imaginary event sourceyield {id : 1,title : 'tRPC is the best!',authorId :input .authorId ,};}),}),});export typeAppRouter = typeofappRouter ;
server.tstsimport {initTRPC } from '@trpc/server';import {z } from "zod";constt =initTRPC .create ();constappRouter =t .router ({post :t .router ({list :t .procedure .query (() => {// imaginary db callreturn [{id : 1,title : 'tRPC is the best!' }];}),byId :t .procedure .input (z .string ()).query ((opts ) => {// imaginary db callreturn {id : 1,title : 'tRPC is the best!' };}),create :t .procedure .input (z .object ({title :z .string (),text :z .string (), })).mutation ((opts ) => {// imaginary db callreturn {id : 1, ...opts .input };}),onPostAdd :t .procedure .input (z .object ({authorId :z .string () })).subscription (async function* ({input }) {// imaginary event sourceyield {id : 1,title : 'tRPC is the best!',authorId :input .authorId ,};}),}),});export typeAppRouter = typeofappRouter ;
使用这些辅助类型,我们可以推断路由的类型。以下示例展示了如何推断 post.create 过程的类型:
client.tstsimport type { inferRouterInputs, inferRouterOutputs } from '@trpc/server';import type { AppRouter } from './server';type RouterInput = inferRouterInputs<AppRouter>;typeRouterOutput = inferRouterOutputs<AppRouter>; typePostCreateInput = RouterInput['post']['create']; typePostCreateOutput = RouterOutput['post']['create'];
client.tstsimport type { inferRouterInputs, inferRouterOutputs } from '@trpc/server';import type { AppRouter } from './server';type RouterInput = inferRouterInputs<AppRouter>;typeRouterOutput = inferRouterOutputs<AppRouter>; typePostCreateInput = RouterInput['post']['create']; typePostCreateOutput = RouterOutput['post']['create'];
推断单个过程类型
如果你已经能够访问路由中的特定过程,可以直接推断其输入或输出类型:
client.tstsimport type {in ferProcedureInput,inferProcedur eOutput,} from '@trpc/server';importtype { AppRouter } from './server'; typePostByIdInput = inferProcedureInput<AppRouter['post']['byId']>; typePostByIdOutput = inferProcedureOutput<AppRouter['post']['byId']>;
client.tstsimport type {in ferProcedureInput,inferProcedur eOutput,} from '@trpc/server';importtype { AppRouter } from './server'; typePostByIdInput = inferProcedureInput<AppRouter['post']['byId']>; typePostByIdOutput = inferProcedureOutput<AppRouter['post']['byId']>;
对于订阅,你可以推断订阅输入及发出的数据类型:
client.tstsimport type {in ferSubscriptionInput,inferSubsc riptionOutput,} from '@trpc/server';importtype { AppRouter } from './server'; typeOnPostAddInput = inferSubscriptionInput<AppRouter['post']['onPostAdd']>; typeOnPostAddOutput = inferSubscriptionOutput<AppRouter['post']['onPostAdd']>;
client.tstsimport type {in ferSubscriptionInput,inferSubsc riptionOutput,} from '@trpc/server';importtype { AppRouter } from './server'; typeOnPostAddInput = inferSubscriptionInput<AppRouter['post']['onPostAdd']>; typeOnPostAddOutput = inferSubscriptionOutput<AppRouter['post']['onPostAdd']>;
推断 TRPCClientError 类型
推断 AppRouter 的错误类型同样非常实用
client.tstsimport { TRPCClientError } from '@trpc/client';import type { AppRouter } from './server';import{ trpc } from './trpc'; exportfunction isTRPCClientError( cause: unknown,): cause isTRPCClientError<AppRouter> { return cause instanceof TRPCClientError; }async function main() {try {await trpc.post.byId.query('1');}catch (cause) { if (isTRPCClientError(cause)) { // `cause` is now typed as your router's `TRPCClientError` console.log('data', cause.data);} else {// [...]}}}main();
client.tstsimport { TRPCClientError } from '@trpc/client';import type { AppRouter } from './server';import{ trpc } from './trpc'; exportfunction isTRPCClientError( cause: unknown,): cause isTRPCClientError<AppRouter> { return cause instanceof TRPCClientError; }async function main() {try {await trpc.post.byId.query('1');}catch (cause) { if (isTRPCClientError(cause)) { // `cause` is now typed as your router's `TRPCClientError` console.log('data', cause.data);} else {// [...]}}}main();