はじめに
TypeScript 3.4を勉強中です。
https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html
今回はconstアサーションについてです。
JavaScriptのconst
JSのconstは再代入不可であり、いわゆる定数ではありません。
const x = { a: 1 };
x.a = 2; // xの再代入はしていない
Object.freezeを使うと、freezeしたプロパティへの変更はできなくなります。
const x = Object.freeze({ a: 1 });
x.a = 2; // TypeError (strict modeの場合)か、無視される
const y = Object.freeze({ a: { b: 2 } });
y.a.b = 3; // エラーにはならない
{ a: { b: 2 } }
のようなネストしたオブジェクトの場合は、deep-freezeのようなライブラリを使ってfreezeすることができますが、一般的にはパフォーマンスに影響があるようです。
TypeScriptのconstアサーション
TS 3.4のconstアサーションを使うとオブジェクトのプロパティをread-onlyにできます。
const x = { a: 1 } as const;
x.a = 2; // read-onlyエラーになる
const y = { a: { b: 2 } } as const;
y.a.b = 3; // read-onlyエラーになる
再帰的なオブジェクトにも効いてくれるようです。Object.freezeとは違ってコンパイル時のチェックですので、やっていることは全く違いますが、多くのケースでは有用ではないかと思われます。
おわりに
TS 3.4の他の機能も今後調べてみようと思います。上記の例はTypeScript Playgroundで手軽に試せますので、試してみてください。
試しに、
const z = Object.freeze({ a: 1 });
z.a = 2;
とやったら、read-onlyのエラーになりました。Object.freezeの型推論もできているのですね。