TypeScript 最小基礎 — 型エラーの読み方・any の回避
TypeScript 最小基礎 — 型エラーの読み方・any の回避
🎯 このレッスンを読み終えたら
このレッスンをすべて読み終えると、以下の 3 つを自信を持ってできるようになります。
- ▸✅ any を unknown に置き換えて安全性を回復する
- ▸✅ interface vs type・ユニオン・オプショナル・never を理解する
- ▸✅ Utility Types 5 つ (Partial・Pick・Omit・Record・Required) を使いこなす
学習目標をチェックリストとして手元に置き、すべて答えられるようになったらレッスンを閉じてください。
⚠️ tsconfig の前提条件 — strict モード基準
すべての例は "strict": true を前提としています
strict がオフの場合 — 別の言語になります
- ▸
nullがすべての型に代入可能 →string型変数に null が入ってもエラーにならない - ▸
noImplicitAnyがオフだとfunction f(x)のxが暗黙的に any になる → 型検査が無効化される - ▸
unknown/neverのナローイング動作が緩くなる
確認方法
ルール: 新規プロジェクトは strict: true がデフォルト (Vite・Next.js・CRA すべて)。既存プロジェクトで練習する前に必ず確認してください。オフになっていると「なぜ本の通りにならないのか?」の 99% の原因がこれです。
TypeScript がトークンを節約する理由
事実 — 2026 年の新規プロジェクトの 90% は TypeScript を使用
Cursor、v0.dev、Claude Code、GitHub Copilot — すべて TypeScript を優先的に生成します。JS で始めても、いつか .ts ファイルが追加されます。
トークン節約のメカニズム — 型情報がコンテキストになる
AI に「sendEmail(currentUser, welcome) を呼び出すコードを書いて」と頼むと:
- ▸JS の場合 → user が何か・どんなフィールドがあるかを改めて説明する必要がある
- ▸TS の場合 → AI が interface を見るだけで自動推論。追加説明は不要
型定義そのものが AI のコンテキストになります。追加プロンプト = 追加トークン。TS で減らせます。
基本型 8 種類
any が危険な理由
any は TypeScript の安全性をすべてオフにします。AI が any を使っていたら unknown に変えてくださいとお願いしましょう。
unknown — 安全な any
使用前に型確認を強制。API レスポンスの解析・外部入力の処理に標準的に使います。
interface vs type・ユニオン・オプショナル
interface vs type — どちらをいつ使うか
ルール: オブジェクトの形には interface、それ以外 (ユニオン・タプル・マッピング) には type。チームの規約が「すべて type」という場合も多い。
ユニオン | — 複数の型のうちの一つ
リテラルユニオンが最もよく使われます:
enum の代わりにリテラルユニオンが現在の標準です。
オプショナル ?
? が付くと undefined も許容されます。関数の引数や DTO によく使われます。
ジェネリクス <T> — 基本形
「型を変数のように」 — 呼び出し時に決まります。ライブラリ (React Hook、Array メソッド) で広く使われています。
never — 絶対に到達しない型
never の正体
すべての型のサブタイプ。「存在し得ない値」を表します。絶対に正常終了しない関数 (throw または無限ループ) の戻り値型も never です:
Exhaustive Check — switch の漏れをコンパイル時に検出
Shape に 'star' を追加すると — switch がそれを処理していないので s の型が 'star' に絞られる → never 型の変数に代入できない → コンパイルエラー。「新しいケースを追加したなら、ここも処理してください」というコンパイラからの強制通知です。
Java の sealed クラス、Rust の enum マッチングと同じ思想の TypeScript 版です。
never vs void — 面接の定番問題
実務での活用 — discriminated union の安全網
TypeScript コードにこのパターンが書かれているすべての場所 — discriminated union + never デフォルトチェック。これを知っていれば、面接で「TypeScript が JavaScript より優れている点」の答えが確固たるものになります。
Utility Types — 面接頻出の 5 つ
TypeScript 組み込みの型変換器
既存の型を加工して新しい型を作ります。この 5 つを知っていれば実務の 99% をカバーできます。
1. Partial<T> — すべてのフィールドをオプションに
2. Required<T> — すべてのフィールドを必須に (Partial の逆)
3. Pick<T, K> — 一部のフィールドだけを選択
4. Omit<T, K> — 一部のフィールドを除外
5. Record<K, V> — キーと値のマップ
enum の代替 — キーがユニオン型なら、コンパイラがすべてのキーが揃っているか検査します。欠けているとエラーになります。
面接のポイント — この 3 つのパターンが実務で毎日登場する
- ▸Partial → PATCH API DTO (
Partial<User>) - ▸Omit → 機密フィールドの削除 (
Omit<User, 'password' | 'tokenSecret'>) - ▸Record → 権限・言語・状態のマップ (
Record<Role, Permission[]>)
その他の Utility Types — 知っていると役立つ
ReturnType / Awaited も面接でよく出ます。「この関数の戻り値型を他の場所でどう再利用しますか?」という問いへの答えが ReturnType です。
型エラーの読み方・型アサーション・React との連携
エラーメッセージをじっくり読んでください
本当の原因は下の行にあります。「email がない」— 渡す側が受け取る側の型を満たしていない。
型アサーション as — 多用すると危険
「信じて、これは HTMLDivElement だ」 — TypeScript の検査を手動で無効化します。
乱用禁止。as だらけのコードは TypeScript を使わないのと同じです。ナローイング (if (typeof x === ...)) や型ガードを先に検討してください。
型ガード
x is User が戻り値の型 — 呼び出し元で TypeScript がナローイングを適用します。
React コンポーネントの型
props インターフェースを分離して定義するのが標準です。
useState の型推論
null の可能性がある場合は明示する — 推論が null だけを見て null 型に絞られてしまうという落とし穴があります。
API レスポンスの型
戻り値の型を明示すると、呼び出し元で自動的にナローイングが適用されます。
🤖 AI へのお願いの仕方
- ▸「この関数に TypeScript の型を付けてください。any は使わず、unknown か明示的な型で」
- ▸「このエラーメッセージを日本語で説明してください」 (そのまま貼り付ければ AI が解説してくれます)
- ▸「この
asアサーションを型ガードに書き換えてください」
TypeScript の 5 つ (interface・ユニオン・オプショナル・ナローイング・ジェネリクス) だけ知っていれば、バイブコーディングの 90% が解決できます。
`as` vs `as const` — まったく異なる 2 つのツール
as — 型システムの回避 (危険)
コンパイラの検査を手動でオフにします。間違ったアサーションをするとランタイムで爆発します。
as const — リテラル型を固定 (安全な代替手段)
配列 → ユニオン型の生成パターン — as const の真の価値
値と型が常に同期されます。ROLES に 'staff' を追加すると Role も自動的に 'admin' | 'user' | 'guest' | 'staff' になります。通常の enum の限界をエレガントに克服します。
オブジェクトの凍結 — 設定・定数のまとめ
実務の例 — Discriminated Union の生成
一言まとめ
- ▸as — コンパイラを騙して型を強制します。ほとんど使わないでください。
- ▸as const — 値から正確なリテラル型を抽出します。安全です。積極的に使いましょう。