📄
概念 📚 beginner-stepup

TypeScript基礎(型システムとPythonとの対比)

Pythonの型ヒントと対比しながらTypeScriptの型システムを理解し、型安全な開発の感覚を身につける

TypeScriptはJavaScriptに静的型付けを追加した言語で、コンパイル時に型エラーを検出できる。Pythonの型ヒント(PEP 484)とmypyの組み合わせに近い概念だが、TypeScriptはより厳格でエコシステム全体で型情報が活用される。

型アノテーションの基本

# Python型ヒント
def greet(name: str) -> str:
    return f"Hello, {name}"

age: int = 30
// TypeScript
function greet(name: string): string {
  return `Hello, ${name}`;
}

const age: number = 30;

基本の型:

const name: string = "Wataru";
const age: number = 40;
const active: boolean = true;
const data: null = null;
const value: undefined = undefined;

// 配列
const scores: number[] = [85, 92, 78];
const names: Array<string> = ["Alice", "Bob"];

// 任意の型(型安全性を失う・基本使わない)
const anything: any = "whatever";

interfaceとtype

オブジェクトの形(構造)を定義する:

# Python
from dataclasses import dataclass
@dataclass
class Patient:
    id: str
    name: str
    age: int
// TypeScript - interface
interface Patient {
  id: string;
  name: string;
  age: number;
  email?: string;  // ? は省略可能(optional)
}

// type エイリアス
type Status = "active" | "inactive" | "pending";  // ユニオン型
type ID = string | number;

interfacetype の使い分け:オブジェクトの形を表すなら interface、プリミティブや共用体・交差型には type。実際はどちらでも動くことが多い。

型推論

明示的に型を書かなくても、TypeScriptが推論してくれる:

const name = "Wataru";     // TypeScriptが string と推論
const scores = [85, 92];   // number[] と推論

// 関数の戻り値も推論される
function add(a: number, b: number) {
  return a + b;  // 戻り値は number と推論
}

ジェネリクス

型をパラメータとして受け取り、再利用性を高める:

# Python
from typing import TypeVar, Generic
T = TypeVar('T')
def first(items: list[T]) -> T:
    return items[0]
// TypeScript
function first<T>(items: T[]): T {
  return items[0];
}

const num = first([1, 2, 3]);      // T は number
const str = first(["a", "b"]);     // T は string

// APIレスポンスの型付けでよく使う
interface ApiResponse<T> {
  data: T;
  status: number;
  message: string;
}

実践的な使い方

APIレスポンスの型定義は最も重要なユースケース:

interface PatientReport {
  id: string;
  patientId: string;
  date: string;
  biomarkers: {
    glucose: number;
    hba1c: number;
  };
}

// fetch の型付け
async function fetchReport(id: string): Promise<PatientReport> {
  const res = await fetch(`/api/reports/${id}`);
  return res.json() as PatientReport;
}

型を定義することで、エディタ(VS Code)が自動補完・エラー検出をしてくれる。Claude Codeも型情報を読んでより正確なコード生成を行う。

tsconfig.json

TypeScriptのコンパイル設定ファイル。重要な設定:

{
  "compilerOptions": {
    "strict": true,         // 厳格モード(推奨)
    "target": "ES2022",     // 出力するJSのバージョン
    "module": "ESNext",
    "moduleResolution": "bundler",
    "jsx": "preserve"       // Reactを使う場合
  }
}

"strict": true を設定すると、null 安全性チェックなど多くのルールが有効になる。最初は制約に感じるが、バグを早期に発見できる。

参考リソース


確認クイズ

Q1. TypeScriptで省略可能なプロパティを定義するとき、プロパティ名の後に付ける記号はどれか。 A. ! B. ? C. * D. ~

正解: B. ?

解説: interfacetype でプロパティ名の後に ? を付けると省略可能(optional)になり、undefined も許容される。Pythonの Optional[str] に相当する。

Q2. const age = 30; と書いたとき、TypeScriptが推論する型はどれか。 A. int B. any C. number D. integer

正解: C. number

解説: TypeScriptには intfloat の区別はなく、整数・浮動小数点数すべてが number 型。明示的に型を書かなくても初期値から型推論が行われる。

Q3. type Status = "active" | "inactive" | "pending" の型定義を何と呼ぶか。

正解: ユニオン型(Union Type)

解説: | で複数の型や値リテラルを組み合わせた型をユニオン型と呼ぶ。この例は文字列リテラルのユニオンで、Status 型の変数には3つの値のいずれかしか代入できない。Pythonの Literal["active", "inactive", "pending"] に相当する。

Q4. tsconfig.json で "strict": true を設定するとどうなるか。

正解: null 安全性チェックなど複数の厳格なルールが一括で有効になり、バグを早期発見しやすくなる

解説: strictstrictNullChecksstrictFunctionTypes など複数のオプションをまとめて有効にするショートカット設定。特に strictNullChecks により nullundefined の扱い漏れをコンパイル時に検出できる。

Q5. interface と type の使い分けとして適切な説明はどれか。 A. interface はオブジェクト定義、type はプリミティブ・ユニオン・交差型に向く B. type はオブジェクト定義にしか使えない C. interface はプリミティブ型の定義に使う D. どちらも完全に同じで使い分け不要

正解: A. interface はオブジェクト定義、type はプリミティブ・ユニオン・交差型に向く

解説: 実際には多くの場面でどちらでも動くが、慣例として interface はオブジェクトの形を表す場合、type はユニオン型(A | B)や交差型(A & B)、プリミティブの別名に使うことが多い。

Q6. ジェネリクスを使う主な目的はどれか。 A. 型チェックを無効にするため B. 型をパラメータとして受け取り、型安全なまま再利用性を高めるため C. ランタイムのパフォーマンスを向上させるため D. インポート文を短くするため

正解: B. 型をパラメータとして受け取り、型安全なまま再利用性を高めるため

解説: function first<T>(items: T[]): T のように <T> で型を受け取ることで、同じ関数を number[] にも string[] にも型安全に使える。Pythonの TypeVarGeneric の組み合わせに相当する。

Q7. any 型を使うことの問題点は何か。

正解: 型安全性が失われ、TypeScriptのコンパイル時エラー検出・エディタの補完・Claude Codeの正確なコード生成が機能しなくなる

解説: any を使うとTypeScriptは型チェックを諦め、実質JavaScriptと同じ状態になる。型情報がないとIDEの補完も機能せず、バグの早期発見というTypeScript最大のメリットが消える。

Q8. async function fetchReport(id: string): Promise の戻り値型 Promise は何を意味するか。

正解: 非同期処理が完了すると PatientReport 型の値が得られることを型として表している

解説: Promise<T> はジェネリクスを使った型で、非同期処理の最終的な解決値の型を指定する。await するとラップが外れて PatientReport 型の値が得られる。

Q9. TypeScriptは何のために「コンパイル時に型エラーを検出する」のか。 A. ブラウザでの実行速度を上げるため B. 開発中にバグを事前に発見するため C. ファイルサイズを小さくするため D. CSSを自動生成するため

正解: B. 開発中にバグを事前に発見するため

解説: コンパイル時のエラー検出により、実行してみるまで気づかなかった型の不一致や undefined 参照を開発段階でつぶせる。これがPythonのmypy静的型チェックと同様の恩恵で、TypeScript採用の主な理由。

Q10. interface ApiResponse で型パラメータ T を使う実践的なユースケースはどれか。

正解: APIエンドポイントごとに異なるレスポンスデータ型を data: T に当てはめて型付けするため(例:ApiResponse<Patient>ApiResponse<Report[]>

解説: ApiResponse の共通フィールド(statusmessage)はそのままに、data フィールドの型だけをエンドポイントごとに変えられる。型ごとに別の interface を作る必要がなくコードの重複を防げる。

生きているコード

本ドキュメントで扱ったパターンの完全な動作コードは、メンター側リポジトリの参照ブランチで確認できます。

  • 対応 Week: W2
  • 参照ブランチ:
  • W2: reference/week-2
  • 対応 checklist 項目: (直接対応なし)

ブランチの作り方・見方は b00-curriculum-map を参照してください。

📚 beginner-stepup 全 53 章
導入編 13 章
  1. 1. 📄Web とは何か
  2. 2. 📄URL を打ってから画面が表示されるまで
  3. 3. 📄ネットワーク基礎(TCP/IP・DNS・HTTPS)
  4. 4. 📄【発展】物理層から通信が成立するまで(電力・Ethernet・Wi-Fi・Bluetooth)
  5. 5. 📄WSL2・Docker セットアップ詳細(Windows 向け)
  6. 6. 📄環境構築の段階的導入(macOS / Windows)
  7. 7. 📄カリキュラム全体マップ(Week × 教材 × 参照ブランチ × 要求チェックリスト)
  8. 8. 📄このカリキュラムの使い方(SQL・Python・Dify経験者向け)
  9. 9. 📄シェル・ターミナル基礎
  10. 10. 📄Windows で完全にゼロから始める開発環境構築(Week 1)
  11. 11. 📄Git基礎
  12. 12. 📄GitHubワークフロー
  13. 13. 📄パッケージ管理(pnpm workspace)
応用編 16 章
  1. 1. 📄AWSインフラ基礎
  2. 2. 📄AWS Budget Alert の設定(Month 5 Week 17)
  3. 3. 📄環境変数管理
  4. 4. 📄Bastion EC2 と SSH ProxyJump(Month 5 Week 18)
  5. 5. 📄CI/CD基礎
  6. 6. 📄ECR への Docker イメージ push と App EC2 デプロイ(Month 5 Week 19)
  7. 7. 📄テスト設計の基本
  8. 8. 📄CloudFront + S3 + ALB で公開する(Month 5 Week 20)
  9. 9. 📄CLAUDE.md・プロジェクト設定
  10. 10. 📄PR レビュー 5 観点ルーブリック(全 Week 共通)
  11. 11. 📄タスク分解・仕様の書き方
  12. 12. 📄Playwright で E2E テスト(Month 6 Week 22)
  13. 13. 📄生成コードのレビュー・デバッグの勘所
  14. 14. 📄Trivy で脆弱性スキャン(Month 6 Week 23)
  15. 15. 📄CloudWatch Logs の読み方と運用(Month 6 Week 23)
  16. 16. 📄PDF ポートフォリオの自動生成(Month 6 Week 24)