上位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
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。
ここからどう深掘りされるか
この問いに答えられた場合、面談は次の質問に進みます。
一部しか触れられなかった場合
const と readonly は、何が違いますか。触れられなかった場合
const と readonly は、何が違いますか。