Collections
readonly: 型だけでは配列を実行時に凍結しない
readonly は TypeScript のコンパイル時契約であり、実行時の変更を止めるには Object.freeze が必要です。
SourcereadonlyArrays.ts
Node.js 22
export function frozenTags(tags: readonly string[]): readonly string[] {
return Object.freeze([...tags]);
}TestreadonlyArrays.test.ts
Node.js 22
import assert from "node:assert/strict";
import test from "node:test";
import { frozenTags } from "../../src/array/readonlyArrays.js";
test("freezeした配列にはpushできない", () => {
const tags = frozenTags(["ts"]);
assert.throws(() => (tags as string[]).push("node"), TypeError);
assert.deepEqual(tags, ["ts"]);
});01Assertion
このテストで確認できること
- readonly T[] は読み取り専用の型として公開できる
- Object.freeze した配列への push は TypeError になる
公開 API には readonly を使い、実行時にも保護が必要なデータだけ Object.freeze を使います。両者の責務は別です。
OBSERVED RESULT
expected exception: Object.freeze(["ts"]).push("node") → TypeError
actual: TypeError