Skip to content

Introduction

openapi-react-queryは、@tanstack/react-query と連携してOpenAPIスキーマを扱うための型安全な軽量ラッパー(1kb)です。

これは openapi-fetch および openapi-typescript を使用することで、以下のすべての機能が提供されます:

  • ✅ URLやパラメータのタイプミスが起こらない
  • ✅ すべてのパラメータ、リクエストボディ、レスポンスが型チェックされ、スキーマと100%一致する
  • ✅ APIの手動での型指定が不要
  • ✅ バグを隠す可能性がある any 型の排除
  • ✅ バグを隠す可能性がある as による型の上書きも排除
tsx
import createFetchClient from "openapi-fetch";
import createClient from "openapi-react-query";
import type { paths } from "./my-openapi-3-schema"; // openapi-typescriptで生成された型

const fetchClient = createFetchClient<paths>({
  baseUrl: "https://myapi.dev/v1/",
});
const $api = createClient(fetchClient);

const MyComponent = () => {
  const { data, error, isLoading } = $api.useQuery(
    "get",
    "/blogposts/{post_id}",
    {
      params: {
        path: { post_id: 5 },
      },
    }
  );

  if (isLoading || !data) return "Loading...";

  if (error) return `An error occured: ${error.message}`;

  return <div>{data.title}</div>;
};

セットアップ

このライブラリを openapi-fetch および openapi-typescript と一緒にインストールします:

bash
npm i openapi-react-query openapi-fetch
npm i -D openapi-typescript typescript

強く推奨

tsconfig.jsonnoUncheckedIndexedAccess を有効にしてください (ドキュメント)

次に、openapi-typescript を使用してOpenAPIスキーマからTypeScriptの型を生成します:

bash
npx openapi-typescript ./path/to/api/v1.yaml -o ./src/lib/api/v1.d.ts

基本的な使い方

スキーマから型が生成されたら、fetch クライアントと react-query クライアントを作成し、API にクエリを実行できます。

tsx
import createFetchClient from "openapi-fetch";
import createClient from "openapi-react-query";
import type { paths } from "./my-openapi-3-schema"; // openapi-typescriptで生成された型

const fetchClient = createFetchClient<paths>({
  baseUrl: "https://myapi.dev/v1/",
});
const $api = createClient(fetchClient);

const MyComponent = () => {
  const { data, error, isLoading } = $api.useQuery(
    "get",
    "/blogposts/{post_id}",
    {
      params: {
        path: { post_id: 5 },
      },
    }
  );

  if (isLoading || !data) return "Loading...";

  if (error) return `An error occured: ${error.message}`;

  return <div>{data.title}</div>;
};

TIP

createFetchClient に関する詳細は openapi-fetch ドキュメント をご覧ください。