0Pricing
TypeScript Academy · レッスン

データ取得とアクションの型付け

サーバーで型付きJSONを使ってデータを取得し、キャッシュと再検証を制御し、フォームやミューテーション向けの型付きServer Actionsを作成します

「データ取得とアクションの型付け」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン2/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全3レッスンが含まれています。

はじめに

目標:サーバーコンポーネントで型付き JSON を取得し、cache/revalidate を設定し、変更処理用の型付きServer Actionsを構築します。

  • 型付き fetch ヘルパー
  • キャッシュ:revalidate と no-store
  • フォームで使う Server Actions

型付き fetch ヘルパー

レスポンスをデコードし、200 以外で throw する小さな json<T> ヘルパーを作成します。ISR のようなキャッシュには revalidate を使います。

// app/lib/http.ts
export async function json<T>(res: Response): Promise<T> {
  if (!res.ok) throw new Error(`HTTP ${res.status}`)
  return (await res.json()) as T
}

// app/page.tsx (server)
export type Post = { id: number; title: string }

export default async function Page() {
  const res = await fetch("https://example.com/api/posts", { next: { revalidate: 60 } })
  const posts = await json<Post[]>(res)
  return (
    <main style={{ display: "grid", gap: 8 }}>
      <h1>Posts</h1>
      <ul>{posts.map(p => <li key={p.id}>{p.title}</li>)}</ul>
    </main>
  )
}

キャッシュ制御

完全に動的なリクエストには cache: "no-store" を使い、N 秒後に再生成するには next.revalidate を使います。

// app/page.tsx (server)
export default async function Page() {
  const res = await fetch("https://example.com/api/now", { cache: "no-store" })
  const data = await res.json() as { now: string }
  return <pre>{JSON.stringify(data, null, 2)}</pre>
}

// Alternative: revalidate per request
// fetch(url, { next: { revalidate: 5 } })

Server Action モジュール

モジュール内(または関数内)に "use server" を追加します。Server Actions はサーバー上で実行され、サーバー専用 API を呼び出した後に revalidatePath を実行できます。

// app/actions.ts
"use server"
import { revalidatePath } from "next/cache"

export async function createPost(form: FormData): Promise<{ id: string }> {
  const title = String(form.get("title") || "")
  if (!title) throw new Error("title required")
  // pretend DB insert
  const id = Math.random().toString(36).slice(2)
  revalidatePath("/")
  return { id }
}

action を使うクライアントフォーム

Server Action をフォームの action にバインドします。useTransition を使って保留中の UI を表示します。型は Action のシグネチャから引き継がれます。

"use client"
import { useTransition } from "react"
import { createPost } from "../actions"

export default function NewPost() {
  const [pending, start] = useTransition()

  const onSubmit = async (formData: FormData) => {
    await createPost(formData)
  }

  return (
    <form action={(fd) => start(() => onSubmit(fd))} style={{ display: "grid", gap: 8 }}>
      <input name="title" placeholder="Title" />
      <button disabled={pending}>{pending ? "Creating…" : "Create"}</button>
    </form>
  )
}

ヒントと安全対策

ヒント:

  • シークレットの取得にはサーバー側でのデータ取得を優先し、結果を props として渡します。
  • Action から型付き Error を throw し、UI では境界を使って処理します。
  • 変更処理後は影響を受けるパスを再検証します。

Server Action の型付け確認

確認問題:関数を Server Action として指定し、型を維持するにはどうしますか?

まとめ

まとめ:型付きヘルパーで JSON をデコードし、no-store と revalidate を適切に選び、型付き Server Actions を使って安全に変更処理と再検証を行います。

よくある質問

「データ取得とアクションの型付け」レッスンは無料ですか?

はい。「データ取得とアクションの型付け」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全3レッスンが含まれています。

「データ取得とアクションの型付け」で何を学びますか?

サーバーで型付きJSONを使ってデータを取得し、キャッシュと再検証を制御し、フォームやミューテーション向けの型付きServer Actionsを作成します ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

TypeScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/3です。

「データ取得とアクションの型付け」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTypeScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. App Routerの型、サーバーコンポーネントとクライアントコンポーネント
  2. データ取得とアクションの型付け
  3. 環境変数の型付けと設定
← TypeScript Academyに戻る