IT-Q

上位3件を返す関数 top3(users: User[]) の中で users.sort(...) を呼んでいたため、呼び出し側の一覧の並び順まで変わっていました。型でどう防ぎますか。

引数を readonly User[] にすると、sort や push のような書き換えるメソッドがエラーになります。並べ替えは [...users].sort() や toSorted で複製してから行います。

面接官が見ているのはreadonly 配列で、意図しない書き換えを型で止められるか。

よくある答えと、面談でどう見られるか

  • 引数を readonly User[] にする。sort はエラーになるので、[...users].sort(...) や toSorted のように複製して並べる
    その通りです。readonly にすれば、書き換えるメソッドがそもそも呼べなくなります。
  • 関数の中で複製してから sort するよう直す
    この不具合は直りますが、次に誰かが同じ書き方をしても止まりません。引数を readonly にすれば型で防げます。
  • 呼び出し側の変数を const で宣言する
    const は変数の再代入を禁じるだけで、配列の中身の書き換えは止めません。
  • sort は中身を書き換えないので、別の原因を探す
    sort は配列そのものを並べ替えて、その配列を返します。

模範解答

引数を readonly User[](ReadonlyArray<User>)にします。

  function top3(users: readonly User[]): User[] {
    return [...users].sort((a, b) => b.score - a.score).slice(0, 3)
  }

JavaScript の sort は、新しい配列を作らずに元の配列を並べ替えます。呼び出し側と同じ配列を受け取っているので、呼び出し側の並び順も変わります。

readonly 配列には sort や push のような書き換えるメソッドが無いので、users.sort(...) と書いた時点でエラーになります。公式のハンドブックも、ReadonlyArray を受け取る関数は「渡しても中身を変えられない」ことが分かる、と説明しています。

並べ替えは、複製してから行います。ES2023 の toSorted(複製して並べ替える)も使えますが、tsconfig の lib と実行環境が対応している必要があります。

対象: TypeScript 5.x〜7.0 照合した一次資料: 公式ドキュメント 照合: 2026-10-25 最終更新: 2026-10-25
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。

ここからどう深掘りされるか

この問いに答えられた場合、面談は次の質問に進みます。