TypeScriptにおいて型アサーションといった機能が存在します。
型アサーションの機能は、使い方によってTypeScriptのメリットを享受できなくなるため、使用法に注意が必要です。
本記事では、型アサーションの基本的な使い方を解説します。
型アサーションとは?
型アサーションとは、「式 as 型」といった形で式の型を強制的に変更する機能になります。
また唐突ですが、型アサーションの使用はできる限り避けるべきです。
なぜなら、型アサーションはTypeScriptが保証する型安全性を意図的に破壊してしまう機能だからです。
型アサーションを用いて式の型をごまかす
実際に型アサーションを用いて式の型をごまかす例を考えます。
funcion getStrOrNum(strOrNum: string | number) {
const str = strOrNum as string;
return str.slice(0, 3);
}
console.log(getStrOrNum("test"));
// "tes"と表示される
console.log(getStrOrNum(18));
// ランタイムエラーが発生
上記の関数では、引数の型としてstring型とnumber型を受け取ることができます。
ここでasを利用することでstrOrNumの型をstring型に強制変更しています。
より正確に言えば、strOrNumはstring | number型ですが、strOrNum as stringといった式の型はstringです。
よって、strはstring型になります。
そのため、return文に存在するsliceメソッドを呼び出してもコンパイルエラーが発生しません。
しかしながら、型アサーションはコンパイラ上の型を強制的に変更した構文であり、値の実体は変わりません。
つまり、string型であるstrに対して数値が格納されている状態が引き起こされているわけです。
このように型アサーションは、型安全性を破壊していることになります。
実際に、コンパイル後に上の例を実行すると、数値に対してsliceメソッドを呼び出そうとしたことによるランタイムエラーが発生します。
型アサーションのメリットとデメリット
ここまで、型アサーションの使い方を記載しましたが、この機能にもメリットがあります。
- TypeScriptの型推論は完璧ではない
- 不正確な型を正しく直すために利用する
TypeScriptの型推論は非常に強力ですが、型の絞り込みがいつでも完全にきのうするわけではありません。
そのため、型アサーションといった機能が役立つ場面が存在します。
しかし、型アサーションを利用する場面は限定的に実施すべきです。
- 型安全性の破壊
- ランタイムエラーにつながってしまう
そもそも型の安全性を保証するTypeScriptのメリットを打ち消してしまう可能性があります。
また、コンパイルエラーが発生せず、コード実行時にエラーが発覚してしまう可能性が生まれてしまいます。
型アサーションの使用時は、とても慎重に扱うよう注意しましょう。
型アサーションの存在理由
型アサーションのメリットとデメリットについて記載しましたが、改めて型アサーションがなぜ必要なのか考えていきます。
型アサーション(any型なども含め)は、型安全性を破壊する非常に危険な型です。
しかし、以下の理由から用意された機能であることも考えられます。
- JavaScriptからTypeScriptへの移行支援
- JavaScriptの柔軟なコードを制限しないため
それぞれ解説していきます。
JavaScriptからTypeScriptへの移行支援
そもそもTypeScriptはJavaScriptの違いは、型が書いてあるかどうかであるため、移行作業は型を書き足していくことになります。
つまり、JavaScriptで書かれたプログラムは、型が全く書かれていないTypeScriptであるとみなせます。
TypeScriptで主に型が記述されるのが変数の型注釈と関数引数の型注釈になると思います。
そのため、移行作業中に型アサーションなどを利用して型の無効化を実施し、本来JavaScriptが持つ柔軟なプログラムを保持する役割も必要になるわけです。
JavaScriptの柔軟なコードを制限しないため
TypeScriptは型チェック機構を用いてJavaScriptに一定の秩序を与えます。
しかし、JavaScriptの柔軟性を活かして記述された難解なプログラムは、TypeScriptの型で表現できず、有用なプログラムをコンパイルエラーで書けないといった事象も引き起こします。
そのため、型チェックといったTypeScriptの恩恵を放棄したとしても、JavaScriptのプログラムを優先させることが重要なケースも存在します。
その際の処置として、型アサーションやany型といった型安全性の破壊が実施されます。
ただし、プログラム安全性の責任を担っていたTypeScriptの型チェック機構から、1プログラマーに責任が移行するため、可能な限り型アサーションは避けるべきといった見解です。
コメント