LoginSignup
14

More than 3 years have passed since last update.

Typescript 3.4のconstアサーションを試す

Posted at

はじめに

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の型推論もできているのですね。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14