unknown型とは?
「number型かもしれない」、「string型かもしれない」という曖昧な型のことです。TypeScript3.0で導入されました。
unknownを指定すると型安全が保障されるコードでなければコンパイルエラーになります。ただ、コンパイル時にエラーになる可能性があるため、できるだけ具体的な型を指定した方が良いです。
anyと似ている
anyと同じようにnumberでもstringでもなんでも入れることができます。ただ、anyに比べると使う時に型が違っているとエラーになるので少し厳しくなります。
エラーになる例
1 2 3 4 |
const a = (): number => 2; let c: unknown = a(); let c = b + 10; |
コンパイル時にエラーになります。
エラーにならない例
typeofによるタイプガード
タイプセーフ(例:typeofによりチェックをすることで、絶対にnumber型などだとわかっている場合のみ許す)を記述する事でコンパイルエラーから回避する事が可能です。
1 2 3 4 5 6 |
const a = (): number => 2; let c: unknown = a(); if (typeof c === 'number') { let c = 10; } |
as(型アサーション)を使う
1 2 3 4 |
const a = (): number => 2; let c: unknown = a(); (c as number) = 10;た |
ただ、型アサーションは無理矢理任意の型に上書きする行為なのでそもそも使うことがあまり推奨されません。型変換自体に問題があったとしてもその変換が誤っていることを実行時に初めて気づくことになるためです。
できるだけtypeofによるタイプガードを利用するようにしましょう。
まとめ
anyだと型が誤っていても実行時にしか気づけませんが、unknownだとコンパイル時に気づくことができるのでanyよりは良いですよという感じになります。(よりタイプセーフになったanyと言う位置付け)
ただ、できればanyもunknownもどちらも不定型にはなるので使わないことには越したことはないです。既存のソースコードで使われいた場合にこのような対処法をとれば対応できると言うことだけは覚えておきましょう。
特に外部パッケージなど外部のソースを取り込むときに遭遇しやすいかもしれません。anyを返すパッケージの関数などがあった場合に一度unknownで受けてタイプガードを行うみたいな流れが良いのかもしれません。
この記事へのコメントはありません。