0Pricing
TypeScript Academy · レッスン

Readonly 配列と不変データ

ReadonlyArray を使って、意図しない変更を防ぎます。

「Readonly 配列と不変データ」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。

ようこそ

変更可能な配列は、コード内のどこからでも誤って変更される可能性があります。TypeScriptのReadonlyArrayとreadonly修飾子を使うと、不変性を適用できます。

配列に対するreadonly修飾子

配列型の前に`readonly`修飾子を付けると、変更を防げます。配列の読み取りはできますが、変更はできません。
const ids: readonly number[] = [1, 2, 3];
// ids.push(4);   // Error
// ids[0] = 99;   // Error
console.log(ids[0]); // OK — reading is fine

ReadonlyArray<T>ジェネリック形式

`ReadonlyArray`は`readonly T[]`と同等のジェネリック形式です。どちらもpush、pop、splice、インデックスによる代入を防ぎます。
const names: ReadonlyArray<string> = ['Alice', 'Bob'];
// names.push('Charlie'); // Error

関数からreadonly配列を返す

関数からreadonly配列を返すと、呼び出し側に結果を変更してはいけないことを示せます。
function getConfig(): readonly string[] {
  return ['host', 'port', 'db'];
}

不変な関数パラメーター

配列パラメーターにreadonlyを付けると、関数が呼び出し側の配列を変更するのを防げます。
function sum(nums: readonly number[]): number {
  return nums.reduce((a, b) => a + b, 0);
  // nums.push(99); // Error inside function
}

リテラル配列に対するas const

`as const`アサーションを使うと、配列がreadonlyになり、拡大された型ではなくリテラル要素型を持つタプル型として推論されます。
const colors = ['red', 'green', 'blue'] as const;
// type: readonly ['red', 'green', 'blue']
// colors.push('yellow'); // Error

Readonlyはディープフリーズではない

readonlyが防ぐのは配列参照の変更だけです。要素がオブジェクトの場合、そのプロパティは引き続き変更できます。
const users: readonly { name: string }[] = [{ name: 'Alice' }];
// users.push({}); // Error
users[0].name = 'Bob'; // Allowed — object itself is mutable

Readonly<T>による深い不変性

オブジェクトを深く不変にするには、要素にReadonlyを適用し、ReadonlyArrayと組み合わせてください。または、immerのようなライブラリを使用します。
type ImmutableUser = Readonly<{ name: string; scores: readonly number[] }>;
const u: ImmutableUser = { name: 'Alice', scores: [90, 85] };
// u.name = 'Bob';       // Error
// u.scores.push(100);  // Error

変更可能な配列とreadonly配列の代入

readonly配列を変更可能な配列型に代入することはできません。これにより、変更が想定されている場所に不変の配列を誤って渡すことを防げます。
const ro: readonly number[] = [1, 2];
const mutable: number[] = ro; // Error!

readonly配列を使用する場合

設定オブジェクト、定数、変更しないことを保証する関数パラメーター、純粋関数の戻り値にはreadonly配列を使用してください。

スプレッドで新しい変更可能な配列を作成する

readonly配列を新しい配列リテラルにスプレッドすると、変更可能なコピーが作成されます。これは、元の配列を変更せずに変更を加えるための明快なパターンです。
const base: readonly number[] = [1, 2, 3];
const extended: number[] = [...base, 4]; // new mutable array

クイックチェック

TypeScriptで`readonly number[]`に対して許可されない操作はどれですか?

まとめ

配列の変更を防ぐには、`readonly T[]`または`ReadonlyArray`を使用します。リテラルの定数配列には`as const`を使用します。readonly配列を拡張する必要がある場合は、スプレッドによって変更可能なコピーを作成できます。

よくある質問

「Readonly 配列と不変データ」レッスンは無料ですか?

はい。「Readonly 配列と不変データ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。

「Readonly 配列と不変データ」で何を学びますか?

ReadonlyArray を使って、意図しない変更を防ぎます。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

TypeScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「Readonly 配列と不変データ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTypeScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 型付き配列: T[] と Array
  2. Readonly 配列と不変データ
  3. タプル: 固定長の型付き配列
  4. 列挙型:数値定数と文字列定数
← TypeScript Academyに戻る