フロントエンドの用語一覧へ
このページの目次

型共有とは?

最終更新:2026/08/18

3秒でわかる

APIリクエストやレスポンスのを、フロントとバックエンドで同じ定義から参照する手法。片方だけ直したときのずれをコンパイル時に検出できる。

もう少し詳しく

どういうものか

API でやり取りするデータの型定義を一箇所に置き、フロントエンドとバックエンドの双方がそこを参照する作り方です。モノレポの共有パッケージに置く、バックエンドの型を直接インポートする、スキーマから両方の型を生成する、といった実現方法があります。

同じ形を 2 回書かないことが要点です。片方を直せば、もう片方は型が合わなくなってコンパイルエラーになります。伝え忘れという事故を、仕組みで防ぐという発想です。

なぜ必要か

API の変更が一番壊れやすい継ぎ目だからです。サーバー側で namefullName に変えたとき、フロントの user.name は静かに undefined になります。TypeScript を使っていても、型を別々に書いていれば古い定義がそのまま通ってしまい、画面に空白が出て初めて気付きます。

型を共有していれば、この変更はビルド時点で赤くなります。実行して画面を開いて確かめるまでの往復が消え、直す場所も型エラーが出た行として提示されます。人数が増えるほど、また API の数が増えるほど効いてきます。

具体例

共有パッケージに型だけを置き、両側から読みます。

// packages/shared/src/api.ts export type User = { id: number; fullName: string; email: string; }; export type GetUsersResponse = { users: User[]; total: number; };
// apps/api/src/routes/users.ts import type { GetUsersResponse } from "@app/shared"; app.get("/users", async (req, res) => { const users = await db.user.findMany(); const body: GetUsersResponse = { users, total: users.length }; res.json(body); });
// apps/web/src/api/users.ts import type { GetUsersResponse } from "@app/shared"; export async function fetchUsers(): Promise<GetUsersResponse> { const res = await fetch("/api/users"); return res.json(); }

Zod のようなスキーマを使えば、型と入力検証を 1 つの定義から導けます。

import { z } from "zod"; export const userSchema = z.object({ id: z.number(), fullName: z.string(), email: z.string().email(), }); export type User = z.infer<typeof userSchema>;

つまずきやすいところ

  • 型だけのつもりが実装まで共有パッケージへ入り、フロントのバンドルにサーバー用のコードが混ざる。読み込みは import type に統一すると混入を防げます

  • fetch の結果に型注釈を付けただけで安心する。実行時に検証しているわけではないので、サーバーが違う形を返せばそのまま通ります。境界ではスキーマで検証します

  • 共有パッケージのビルドを忘れ、古い型のまま参照される。参照側だけ直しても直らないので、依存の順番でビルドが走る設定にしておきます

  • DB のモデル型をそのまま API の型として公開し、パスワードのハッシュなど出してはいけない列まで型に含める。API 用の型は別に定義します
  • 似た用語との違い

    手法型の出どころ
    型定義の共有手で書いた TypeScript の型を両側で参照する
    スキーマからの生成Zod や OpenAPI の定義から型を導く
    tRPCサーバーの実装そのものから型が推論される


    下に行くほど手で書く量は減りますが、構成の自由度は下がります。

    知識のつながり

    サイドバーと同じ推奨ルート・関連語を、まとめて確認できます。

    現在地型共有フロントエンド

    LEARN BY DOING

    この用語を、教材で使ってみる

    直接関連する編と、その編を含むコースです。用語だけで終わらず、ブラウザ上で実際に手を動かせます。

    この用語を扱うコース

    コース

    TypeScript入門:型を付けて関数を書く

    22レッスン
    コース

    TypeScript道場 fleama開発室の10問

    10レッスン
    コース

    Next.js入門:App Routerとレイアウト

    21レッスン
    TypeScriptコースの全編を見る