コース一覧
TypeScript型設計:オブジェクト・状態・ジェネリクス
なぜジェネリクスか

TypeScript型設計:オブジェクト・状態・ジェネリクス

interface、optional property、readonly、union・リテラル型、型ガード、ジェネリクスを扱う全23レッスンの型設計コースです。Profile・Work・ApplicationStateを題材に、APIや画面で扱うデータと状態を壊れにくい型として設計します。既存JavaScriptプロジェクトの移行は次のコースで扱います。

1
オブジェクト型とinterface
0. interface15分
1. 省略可能なプロパティ15分
2. readonly15分
3. interfaceとtype15分
4. ネストした型15分
5. オブジェクト配列15分
6. つくる - Work型とProfile型20分
7. 第4章クイズ15分
2
union・リテラル型・型ガード
0. union型15分
1. リテラル型15分
2. 状態のunion15分
3. typeofで絞り込む15分
4. inと判別で絞り込む15分
5. 状態で表示を切り替える15分
6. つくる - 状態の型表現20分
7. 第5章クイズ15分
3
ジェネリクス入門
0. なぜジェネリクスか10分
1. ジェネリック関数15分
2. 配列を返す汎用関数15分
3. 制約付きジェネリクス15分
4. 組み込みのジェネリクス15分
5. つくる - 汎用フィルタ関数20分
6. 第6章クイズ15分

TypeScript型設計:オブジェクト・状態・ジェネリクス

01interface
02省略可能なプロパティ
03readonly
04interfaceとtype
05ネストした型
06オブジェクト配列
07つくる - Work型とProfile型
08第4章クイズ
09union型
10リテラル型
11状態のunion
12typeofで絞り込む
13inと判別で絞り込む
14状態で表示を切り替える
15つくる - 状態の型表現
16第5章クイズ
17なぜジェネリクスか
18ジェネリック関数
19配列を返す汎用関数
20制約付きジェネリクス
21組み込みのジェネリクス
22つくる - 汎用フィルタ関数
23第6章クイズ

TypeScript型設計:オブジェクト・状態・ジェネリクス

なぜジェネリクスか

同じ処理を、型が違うだけで書き直している

作品タイトルの配列から先頭を取り出す関数です。

TypeScript

function firstTitle(items: string[]): string { return items[0]; }

作品 ID の配列でも同じことをしたくなりました。中身は 1 文字も違わないのに、型が違うのでもう 1 本必要になります。

TypeScript

function firstId(items: number[]): number { return items[0]; }

boolean[] でも、第4章で作った Work[] でも同じです。扱いたい型が増えるたびに、まったく同じ処理が増えていきます。

any でまとめると、検査が消える

いちばん手軽なまとめ方が any です。

TypeScript

function first(items: any[]): any { return items[0]; }

1 本で済みます。ただし戻り値の型が any になります。

TypeScript

const titles = ["プロフィールサイト", "自己紹介カード"]; const title = first(titles); title.toUpperCase(); // 通る title.toFixed(2); // これも通ってしまう

toFixed は数値のメソッドです。title の正体は文字列なので、実行すると title.toFixed is not a function で落ちます。それでもエディタは何も言いません。第2章で見たとおり、any を書いた場所から先は検査が止まるからです。

汎用にした代償として、型の情報を捨ててしまったわけです。

欲しいのは「呼ぶときに決まる型」

本当に必要なのは、string でも number でもない、呼び出すたびに中身が入れ替わる型です。それを書けるようにするしくみがジェネリクスです。

TypeScript

function first<T>(items: T[]): T { return items[0]; } const title = first(titles); // string に決まる const id = first([1, 2, 3]); // number に決まる

T は型を入れる箱です。関数は 1 本のまま、返ってきた値の型は呼び出しごとに決まります。だから title.toFixed(2) は、実行する前にエラーになります。

手を動かす

この章では、この T を自分で書けるようにしていきます。まずはエディタで any 版の first を書き、返ってきた値に存在しないメソッドを呼んでも何も言われないことを確かめてください。次のレッスンで、同じ関数を型引数で書き直します。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 処理計算や代入を表す長方形
  • 配列サイズ固定の同型データの集まり
  • 関数処理に名前を付けて再利用できる単位
  • 戻り値呼び出し元への返答を表す点線矢印
  • メソッドクラスに属する関数
  • ジェネリクス<String> のように型を指定する仕組み
  • 引数位置引数=順番で渡す。
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/06

関連レッスン

  • ジェネリック関数

    先頭要素を返すfirst関数を型引数付きで書き、汎用関数を型安全に作れるようになります。

  • 配列を返す汎用関数

    配列を逆順で返す関数を書き、配列の入出力を型引数で表せるようになります。

  • 制約付きジェネリクス

    idを持つ物だけを受け取る関数を書き、型引数に条件を付けられるようになります。

  • 組み込みのジェネリクス

    fetch結果の型を読み解き、ArrayやPromiseの型引数を読めるようになります。

分からないところは Tap (AI先生) に質問できます

24 時間いつでも、あなたのレベルに合わせて日本語で答えます。