1. 作品タイトルの配列
  2. 作品 ID の配列
  3. 公開フラグの配列
  4. 要素が 1 つだけの配列
  5. 空の配列
  6. 作品オブジェクトの配列
コース一覧
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分

配列を返す汎用関数

入口も出口も T[] にする

前のレッスンの first は、T[] を受け取って T を返しました。返すものも配列なら、戻り値にも T[] と書きます。

TypeScript

function duplicateAll<T>(items: T[]): T[] { return items.concat(items); }

T は 1 本の関数の中で何度出てきても同じ型を指します。だからこの 1 行で、受け取った配列と同じ要素型の配列が返る、という関係が伝わります。

TypeScript

const titles = ["プロフィールサイト", "自己紹介カード"]; const doubled = duplicateAll(titles); // string[] に決まる

途中の変数にも T を使う

関数の中で新しい配列を組み立てるときは、その変数にも T[] と書けます。

TypeScript

function withoutFirst<T>(items: T[]): T[] { const result: T[] = []; for (let i = 1; i < items.length; i++) { result.push(items[i]); } return result; }

const result = [] とだけ書くと、TypeScript は要素の型を決められません。T[] と宣言しておけば、push に違う型を入れようとした時点でエラーになります。

元の配列を書き換えない

汎用関数は、いろいろな場所から呼ばれます。渡された配列そのものを並べ替えると、呼んだ側の配列まで変わってしまいます。

TypeScript

items.reverse(); // 渡された配列そのものが逆順になる [...items].reverse(); // コピーを作ってから逆順にする

新しい配列を作って返す、を基本にしてください。汎用にするほど、呼び出し元が見えなくなるからです。

手を動かす

演習では、配列を逆順にして返す関数を書きます。型引数を 1 つ宣言して、引数と戻り値の両方に使ってください。処理の中身も途中までしか書いてありません。元の配列は変えずに、新しい配列を返します。

要件

  1. 型引数を 1 つ宣言し、引数と戻り値の両方に使う
  2. 受け取った配列は書き換えず、新しい配列を返す
  3. 空の配列を渡されたら空の配列を返す
  4. any は使わない

入出力例

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

ヒント

型引数は関数名の後ろに山カッコで宣言し、引数と戻り値の両方で使います

組み立て用の配列にも型引数の配列型を書いておきます。書かないと要素の型が決まりません

ループは末尾から先頭へ進んでいるので、そのまま順に積んでいけば逆順になります

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

関連レッスン

  • 制約付きジェネリクス

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

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

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

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

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

  • 第6章クイズ

    ジェネリクスと型の制約の理解を確認します。

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

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

  • 配列サイズ固定の同型データの集まり
  • 戻り値呼び出し元への返答を表す点線矢印
  • 関数処理に名前を付けて再利用できる単位
  • 変数データに名前をつけて参照する仕組み
  • TypeScript静的型を加えた JavaScript の上位互換
  • 引数位置引数=順番で渡す。
  • 処理計算や代入を表す長方形
main.ts
学習モード
エディタを読み込んでいます

メモ

配列を返す汎用関数

⌘S で保存