Language
private と #private: 実行時の隠蔽範囲が異なる
TypeScriptのprivateは型検査の制約で、#privateはJavaScript実行時にも外部アクセスを拒みます。
SourceprivateFields.ts
Node.js 22
export class Counter {
private count = 0;
#secret = 0;
increment() {
this.count += 1;
this.#secret += 1;
}
values() {
return { count: this.count, secret: this.#secret };
}
}TestprivateFields.test.ts
Node.js 22
import assert from 'node:assert/strict';
import test from 'node:test';
import { Counter } from '../../src/language/privateFields.js';
test('privateは実行時プロパティとして書き換えられるが、#privateは外部から作れない', () => {
const counter = new Counter();
(counter as unknown as { count: number }).count = 10;
counter.increment();
assert.deepEqual(counter.values(), { count: 11, secret: 1 });
assert.throws(() => Function('counter', 'return counter.#secret')(counter), SyntaxError);
});01Assertion
このテストで確認できること
- privateのプロパティは実行時に存在する
- #private構文は外部コードでSyntaxErrorになる
実行時のカプセル化が必要なら#privateを使い、privateだけに秘密性を期待しません。
OBSERVED RESULT
private count → writable
#private access → SyntaxError