【TypeScript】as constを学習してみる

こんにちは。野中やすおです。

今回の記事では、TypeScript 3.4で導入されたconst assertionのas constがとても便利なことに気がついたので記事にしてみます。

TypeScript 3.4 Release Notes…

as constとは

as constは、式の末尾に使用されます。as constを使用することでTypeScriptの型推論に以下の効果をもたらします。

  1. Wideningを防ぐ(no literal types in that expression should be widened)
  2. オブジェクトリテラルは、readonlyプロパティになる(object literals get readonly properties)
  3. 配列リテラルはreadonlyタプルになる(array literals become readonly tuples)

 

Wideningとは

Wideningは、よくよくみると英単語「Wide」のing形で、直訳すると拡張しているという意味になります。そこから、「リテラル型が自動的にプリミティブ型に広がって推論されること」を指します。

as constの使用例

まずは以下のようなオブジェクトがあるとします。そして末尾にas constを使用します。

これに

を代入しようとするとreadonlyのためもちろん以下のようにエラーになります。

それなら各プロパティにreadonlyをつければいいだけじゃない?ってなりますが、const assertionは再帰的にオブジェクトリテラルや配列リテラルをreadonlyにすることができます。

この性質を利用して、例えば以下のような関数TestAがあるとします。

この関数に対して、自分は型エラー回避のために以下のように冗長に型をつけていました。

しかしas const を使用してテストケースのデータを修正すると、ColumnType へのキャスト (as ColumnType) の必要がなくなります。

よって以下のようになります。

かなりテストがすっきりしたかと思います。 as constはテストケースで使用するのにも非常に有用であることを学びました。

参考

オブジェクトリテラルの末尾にas constを記述すればプロパティがreadonlyでリテラルタイプで指定した物と同等の…