型の推論
非公式ベータ版翻訳
このページは 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();