TypeScript学習ログ - 2025年1月

学習目標

  • TypeScript Advanced Typesの完全理解
  • 型システムを活用した堅牢なコード設計
  • 実務で使える型テクニックの習得

Week 1: 基礎の復習

学習内容

基本的な型

  • プリミティブ型(string, number, boolean)
  • 配列型とタプル型
  • オブジェクト型
  • Union型とIntersection型

実践コード

// Union型 type Status = 'pending' | 'success' | 'error'; // Intersection型 type User = { name: string } & { age: number }; // タプル型 type Point = [number, number];

気づき

  • Union型は「または」、Intersection型は「かつ」
  • タプル型は順序が重要
  • 型エイリアスで複雑な型を整理できる

Week 2: 高度な型

Generics(ジェネリクス)

// 基本的なジェネリクス function identity<T>(value: T): T { return value; } // 配列のジェネリクス function getFirst<T>(arr: T[]): T | undefined { return arr[0]; } // 制約付きジェネリクス function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key]; }

学んだこと:

  • Genericsで型安全な汎用関数を作れる
  • extends keyofで型安全なプロパティアクセス
  • 型推論が効いて使いやすい

Week 3: Utility Types

Partial と Required

type User = { id: string; name: string; email: string; }; // すべてオプショナル type PartialUser = Partial<User>; // すべて必須 type RequiredUser = Required<User>;

Pick と Omit

// 特定のプロパティだけ抽出 type UserBasic = Pick<User, 'id' | 'name'>; // 特定のプロパティを除外 type UserWithoutEmail = Omit<User, 'email'>;

Record

// キーと値の型を指定 type UserRole = Record<string, 'admin' | 'user' | 'guest'>; const roles: UserRole = { 'user1': 'admin', 'user2': 'user', };

実務での活用例:

  • API レスポンスの型定義に Partial を使用
  • フォームの入力値に Pick で必要な項目だけ抽出
  • 設定オブジェクトに Record を使用

Week 4: 条件付き型

Conditional Types

// T が string なら true、それ以外なら false type IsString<T> = T extends string ? true : false; type A = IsString<string>; // true type B = IsString<number>; // false

infer キーワード

// 関数の戻り値の型を取得 type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never; function getUser() { return { id: '1', name: 'Suzuki' }; } type User = ReturnType<typeof getUser>; // { id: string; name: string; }

Mapped Types

// すべてのプロパティを readonly に type Readonly<T> = { readonly [K in keyof T]: T[K]; }; // すべてのプロパティをオプショナルに type Partial<T> = { [K in keyof T]?: T[K]; };

難しかった点:

  • infer の使い方が最初は理解できなかった
  • Mapped Types の構文が複雑
  • 何度も公式ドキュメントを読み返した

実践プロジェクト

Repository Pattern の型定義

// ベースとなるエンティティ型 type Entity = { id: string; createdAt: Date; updatedAt: Date; }; // リポジトリインターフェース interface IRepository<T extends Entity> { findById(id: string): Promise<T | null>; findAll(): Promise<T[]>; create(data: Omit<T, 'id' | 'createdAt' | 'updatedAt'>): Promise<T>; update(id: string, data: Partial<Omit<T, 'id' | 'createdAt' | 'updatedAt'>>): Promise<T>; delete(id: string): Promise<void>; } // ユーザーエンティティ type User = Entity & { name: string; email: string; }; // ユーザーリポジトリ class UserRepository implements IRepository<User> { async findById(id: string): Promise<User | null> { // 実装 } // ... 他のメソッド }

メリット:

  • 型安全なCRUD操作
  • Omitで自動生成されるフィールドを除外
  • Partialで部分更新を型安全に

学習リソース

公式ドキュメント

書籍

  • 『プログラミングTypeScript』(オライリー)
  • 『実践TypeScript』(技術評論社)

動画

  • Udemy: TypeScript完全ガイド
  • YouTube: Matt Pocock の TypeScript Tips

記事

  • Qiita: TypeScript タグ
  • Zenn: TypeScript トピック

今月の成果

定量的成果

  • 学習時間: 32時間
  • コード量: 500行以上
  • Playground実験: 50回以上

定性的成果

  • Genericsを自由に使えるようになった
  • Utility Typesの使い分けができるようになった
  • 条件付き型の基礎を理解
  • 実務コードの型定義が改善された

来月の学習計画

学習テーマ

  • Template Literal Types
  • Branded Types(名目的型付け)
  • Variance(共変・反変)
  • Type Guards の高度な使い方
  • Declaration Files(.d.ts)の作成

実践プロジェクト

  • 型安全なフォームライブラリ作成
  • Zodとの連携
  • GraphQLの型定義

Tips & Tricks

1. typeof と keyof を組み合わせる

const config = { apiUrl: 'https://api.example.com', timeout: 3000, } as const; type ConfigKey = keyof typeof config; // 'apiUrl' | 'timeout'

2. const assertion で厳密な型

const colors = ['red', 'green', 'blue'] as const; type Color = typeof colors[number]; // 'red' | 'green' | 'blue'

3. satisfies演算子(TypeScript 4.9+)

const config = { apiUrl: 'https://api.example.com', timeout: 3000, } satisfies Record<string, string | number>;

タグ: @学習 @TypeScript @プログラミング @記録

0
0
0
0
投稿
0
フォロワー
0
いいね

プロパティ

ページ
セキュリティチェックリストNext.jsPCゲーム
オードリー・タン