anyの危険

anyの危険

any は検査を止めるスイッチ

any は「どんな型でもよい」を表す型です。書いた瞬間、その値に対する検査がすべて止まります。

const value: any = "プロフィールサイト"; value.toFixed(0); value.存在しないメソッド();

どちらの行もエラーになりません。any は「調べなくていい」と TypeScript に伝える指示だからです。書いたときは楽ですが、実行してはじめて value.toFixed is not a function で落ちます。第1章で見た、型を付ける前の JavaScript と同じ状態に戻っただけです。

any は周りに伝染する

やっかいなのは、any がその場に留まらないことです。

const value: any = "3"; const workCount: number = value; // エラーにならない console.log(workCount + 1); // "31"

number と宣言した変数に文字列が入ってしまいました。any の値は何にでも代入できるので、そこを通り道にして、型を付けたはずの場所まで壊れます。だから any は「とりあえず置いておく」ものではなく、最後の手段です。

分からない値には unknown を使う

外から来る値のように、本当に型が分からないこともあります。そのときは any ではなく unknown を使います。

const value: unknown = "プロフィールサイト"; value.toFixed(0); // エラー 'value' is of type 'unknown'.

unknown は「まだ何か分からない」という型です。分からないうちは何もさせてくれません。any が検査を止めるのに対し、unknown は確かめるまで待たせます。

確かめてから使う

使いたければ、その値が何なのかを先に確かめます。JavaScript と同じ typeof が使えます。

function describe(value: unknown): string { if (typeof value === "number") { return "数です"; } return "数ではありません"; }

typeof value === "number" を通ったブロックの中では、valuenumber として扱われます。この絞り込みは第5章でくわしく扱いますが、ここでは「確かめれば使える」ことだけ覚えてください。

手を動かす

演習では、any のせいで壊れている関数を渡します。型検査は通るのに、あるデータを渡すと実行時に落ちます。unknown に置き換えて、確かめてから使う形に直してください。

要件

  1. 引数 value の型を unknown にする
  2. 数のときは 作品数は3件です の形、文字列のときは 作品名はプロフィールサイトです の形を返す
  3. そのどちらでもないときは 扱えないデータです を返す

入出力例

describeValue(3)"作品数は3件です" describeValue("プロフィールサイト")"作品名はプロフィールサイトです" describeValue(true)"扱えないデータです" describeValue(null)"扱えないデータです" describeValue(0)"作品数は0件です"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.ts
main.ts
学習モード

メモ

anyの危険

⌘S で保存