6.2 リテラル型
リテラル型は、TypeScriptを使いこなす上で非常に強力な機能です。ユニオン型と組み合わせることで、より型安全なコードを書くことができます。
6.2.1 4種類のリテラル型
Section titled “6.2.1 4種類のリテラル型”プリミティブ型をさらに細分化し、「特定の値のみ」を許容する型です。
- 種類: 文字列(例:
"foo")、数値(例:1)、真偽値(例:true)、BigInt(例:3n)の4種類が存在します。 - 特徴: 変数に
const foo: "foo" = "foo";のように型注釈をつけると、その変数には"foo"という文字列以外代入できなくなります。 - 型推論:
constで宣言した変数は、再代入できないため初期値から自動的にリテラル型が推論されます。
6.2.2 テンプレートリテラル型
Section titled “6.2.2 テンプレートリテラル型”文字列のテンプレートリテラルに似た構文を用いて、特定のパターンを持つ文字列型を定義します。
- 構文:
`Hello, ${string}!`のようにバッククオートと型の埋め込みで記述します。 - 用途: この型には
"Hello, world!"など特定の形式を満たす文字列のみが代入可能となり、単なるstringよりも厳密なチェックが可能です。
6.2.3 ユニオン型とリテラル型を組み合わせて使うケース
Section titled “6.2.3 ユニオン型とリテラル型を組み合わせて使うケース”リテラル型の真価は、ユニオン型(|)と組み合わせたときに発揮されます。
- 特定の値のみを受け付ける: 関数の引数などを
"plus" | "minus"のように定義することで、この2種類の文字列のみを受け付けるオプションを安全に実装できます。 - エディタのサポート: VS Codeなどのエディタで入力補完が効くようになり、開発体験が大きく向上します。
6.2.4 リテラル型の widening
Section titled “6.2.4 リテラル型の widening”リテラル型が自動的に対応するプリミティブ型(string や number など)に広げられる(widening)挙動のことです。主に「後から変更される可能性がある」と判断された場合に発生します。
letによる宣言:letでリテラルを代入すると、後からの再代入を許容するため、リテラル型ではなくstringなどのプリミティブ型に推論されます。- オブジェクトのプロパティ: オブジェクトリテラル内のプロパティも、後から書き換え可能なため widening されます。これを防ぐには明示的な型注釈を書くか、後述の
as constを使います。
6.2.5 wideningされるリテラル型・wideningされないリテラル型
Section titled “6.2.5 wideningされるリテラル型・wideningされないリテラル型”リテラル型が widening されるかどうかは、それが「推論されたもの」か「明示的に書かれたもの」かで異なります。
- widening される: 値から自動的に型推論されたリテラル型(型注釈のない
const変数からの推論など)は、別のlet変数に代入される際に widening されます。 - widening されない: プログラマーが明示的に
const uhyo: "uhyo" = "uhyo"のように型注釈として書いたリテラル型は、別のlet変数に代入しても"uhyo"型のまま保たれます。