配列を返す汎用関数

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

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

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

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

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

途中の変数にも T を使う

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

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 に違う型を入れようとした時点でエラーになります。

元の配列を書き換えない

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

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":"プロフィールサイト"}]

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.ts
main.ts
学習モード

メモ

配列を返す汎用関数

⌘S で保存