6.6 any型とunknown型
この節では、TypeScriptにおいて型安全性を破壊する非常に危険な機能である any 型と、それに似ているものの安全に使える unknown 型について解説します。
6.6.1 any型という最終兵器
Section titled “6.6.1 any型という最終兵器”any 型を一言で表すと「型チェックを無効化する型」です。
- 型チェックの放棄:
any型の値に対しては、存在しないプロパティへのアクセスや関数呼び出しなどの操作を行っても、コンパイルエラーが一切発生しません。 - 治外法権の発生:
any型の変数はどんな型の変数にも代入でき、逆にどんな値でも代入できます。これによりTypeScriptの保護が及ばない「治外法権」が生まれ、予期せぬランタイムエラー(クラッシュ)の危険性が極めて高くなります。 - エディタサポートの喪失: 型情報が皆無となるため、IDE(VS Codeなど)によるプロパティの入力補完機能も働かなくなります。
- 警告: コンパイルエラーを消す(コンパイラを黙らせる)目的で安易に
anyを使うことは絶対に避けるべきです。
6.6.2 any型の存在理由
Section titled “6.6.2 any型の存在理由”これほど危険な any 型が存在するのには、主に2つの理由があります。
- JavaScriptからの移行支援: 型のないJavaScriptコードをTypeScriptに移行する際、一時的に型が不明なものを
anyとして扱い、徐々に型注釈を追加してまともなTypeScriptプログラムに近づけていく用途で使われます。 - エスケープハッチ(緊急避難用): JavaScript特有の非常に柔軟で複雑なロジックをTypeScriptの型システムで表現しきれない場合、コンパイルを通すために使われます。
any を使うということは、型安全性の保証責任をTypeScriptコンパイラからプログラマー自身が肩代わりすることを意味します。どうしても必要な場合は、被害を局所化できる as(型アサーション)やユーザー定義型ガードなどで代替できないかを先に検討しましょう。
6.6.3 anyに近いが安全なunknown型
Section titled “6.6.3 anyに近いが安全なunknown型”unknown 型は、any 型と同様に「どんな値でも入れられる(何が入っているか全く不明)」型ですが、安全に使えるという大きな違いがあります。
- 操作の制限:
unknown型は「正体が不明である」ことをコンパイラが厳密に守ります。そのため、unknown型の値に対して直接プロパティアクセスやメソッド呼び出しを行おうとするとコンパイルエラーになります。 - 正しい使い方:
unknown型の値を実際に操作するには、まずtypeof演算子やユーザー定義型ガードを用いて「型の絞り込み」を行う必要があります。 - 使い分け: 外部からの入力など「何が来るか本当にわからない」状況では、危険な
anyではなく、必ず安全なunknownを使用しましょう。