타입 추론
클라이언트에서 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();