Functional
Object.freeze: 凍結は一段目だけに適用される
Object.freeze はトップレベルのプロパティを保護しますが、ネストしたオブジェクトを再帰的には凍結しません。
SourcefrozenObjects.ts
Node.js 22
export type Config = { name: string; flags: { debug: boolean } };
export function freezeConfig(config: Config): Readonly<Config> {
return Object.freeze(config);
}TestfrozenObjects.test.ts
Node.js 22
import assert from "node:assert/strict";
import test from "node:test";
import { freezeConfig } from "../../src/object/frozenObjects.js";
test("freezeしたオブジェクトでも入れ子は変更できる", () => {
const config = freezeConfig({ name: "app", flags: { debug: false } });
assert.throws(() => { (config as { name: string }).name = "other"; }, TypeError);
config.flags.debug = true;
assert.equal(config.flags.debug, true);
});01Assertion
このテストで確認できること
- トップレベルのプロパティ代入は TypeError になる
- ネストしたオブジェクトは変更できる
深い不変性が必要なら、データ構造と更新 API を設計します。Object.freeze を深い不変性の保証と誤解しません。
OBSERVED RESULT
expected: config.name assignment → TypeError
actual: TypeError
expected: config.flags.debug → true