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" を通ったブロックの中では、value は number として扱われます。この絞り込みは第5章でくわしく扱いますが、ここでは「確かめれば使える」ことだけ覚えてください。
手を動かす
演習では、any のせいで壊れている関数を渡します。型検査は通るのに、あるデータを渡すと実行時に落ちます。unknown に置き換えて、確かめてから使う形に直してください。
要件
- 引数
valueの型をunknownにする - 数のときは
作品数は3件ですの形、文字列のときは作品名はプロフィールサイトですの形を返す - そのどちらでもないときは
扱えないデータですを返す
入出力例
describeValue(3) → "作品数は3件です"
describeValue("プロフィールサイト") → "作品名はプロフィールサイトです"
describeValue(true) → "扱えないデータです"
describeValue(null) → "扱えないデータです"
describeValue(0) → "作品数は0件です"ヒント
編集 LuaGate編集部