1. 作品タイトルの配列
  2. 作品 ID の配列
  3. 公開フラグの配列
  4. 作品オブジェクトの配列
  5. 要素が 1 つだけの配列
コース一覧
TypeScript型設計:オブジェクト・状態・ジェネリクス
ジェネリック関数

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

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

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

ジェネリック関数

型引数を宣言する

関数名の後ろに山カッコで名前を書くと、その関数の中だけで使える型の箱ができます。これを型引数と呼びます。

TypeScript

function first<T>(items: T[]): T { return items[0]; }

T が箱です。引数を T[]、戻り値を T と書いたので、受け取った配列の要素と返す値は同じ型だ、という関係だけを宣言したことになります。その型が何なのかは、まだ決めていません。

中身は呼び出した瞬間に決まる

決めるのは呼ぶ側です。渡した配列から TypeScript が推論します。

TypeScript

const titles = ["プロフィールサイト", "自己紹介カード"]; const ids = [1, 2, 3]; const a = first(titles); // a は string const b = first(ids); // b は number

any 版と違い、返ってきた値の型が残っています。

TypeScript

a.toFixed(2); // エラー Property 'toFixed' does not exist on type 'string'.

関数は 1 本のまま、検査は型ごとに効いています。これがジェネリクスの取り分です。

名前は T でなくてもよい

T は type の頭文字で、慣習としていちばんよく使われるだけです。読み手に伝わる名前も付けられます。

TypeScript

function first<Item>(items: Item[]): Item { return items[0]; }

呼ぶ側から指定することもできる

推論に任せず、中身を書いて渡すこともできます。

TypeScript

const c = first<string>(titles);

ふだんは書きません。推論がうまく効かないときの逃げ道として、こういう書き方があることだけ覚えておいてください。

手を動かす

演習では、配列の先頭を返す first を書きます。いまは引数の型が無いので動きません。どんな配列を渡しても、その要素の型がそのまま戻り値の型になるように、型引数を使って書いてください。

要件

  1. 型引数を 1 つ宣言する
  2. 引数は宣言した型引数の配列にする
  3. 戻り値は宣言した型引数そのものにする
  4. any は使わない

入出力例

first(["プロフィールサイト","自己紹介カード","スキル一覧の表"]) → "プロフィールサイト" first([7,3,1]) → 7 first([true,false,true]) → true first([{"id":1,"title":"プロフィールサイト"},{"id":2,"title":"自己紹介カード"}]) → {"id":1,"title":"プロフィールサイト"} first(["スキル一覧の表"]) → "スキル一覧の表"

ヒント

型引数は関数名のすぐ後ろに、山カッコで囲んで書きます

引数の型は、宣言した型引数の後ろに角カッコを付けた形です

戻り値の型は、配列ではなく型引数そのものになります

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/06

関連レッスン

  • 配列を返す汎用関数

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

  • 制約付きジェネリクス

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

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

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

  • つくる - 汎用フィルタ関数

    filterBy関数を型引数付きで完成させ、型安全な汎用処理を書けるようにします。

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

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

  • 引数位置引数=順番で渡す。
  • 関数処理に名前を付けて再利用できる単位
  • 戻り値呼び出し元への返答を表す点線矢印
  • 配列サイズ固定の同型データの集まり
  • TypeScript静的型を加えた JavaScript の上位互換
  • ジェネリクス<String> のように型を指定する仕組み
main.ts
学習モード
エディタを読み込んでいます

メモ

ジェネリック関数

⌘S で保存