配列を返す汎用関数
入口も出口も 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 つ宣言し、引数と戻り値の両方に使う
- 受け取った配列は書き換えず、新しい配列を返す
- 空の配列を渡されたら空の配列を返す
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編集部