1any には何でも代入できる
any 型の変数には文字列・数値・真偽値をどれでも代入でき、一切エラーになりません。「エラーが出ない = 型チェックが働いていない」という any の基本性質を確かめる例です。
let flexibleValue: any = "hello";
console.log(flexibleValue);
flexibleValue = 123;
console.log(flexibleValue);
flexibleValue = true;
console.log(flexibleValue);
// どの代入もエラーにならない = 型チェックされていない
2チェックなしで操作できてしまう
any の値にはどんなメソッド呼び出しを書いてもコンパイルが通ります。中身が文字列のうちは動きますが、数値に変わっても同じコードが書けてしまう、という危うさを示す例です。
let rawText: any = "typescript";
// any ならどんな操作もコンパイルが通る
console.log(rawText.toUpperCase());
// 中身が数値に変わっても、コンパイラは何も警告しない
rawText = 999;
console.log(rawText);
// console.log(rawText.toUpperCase()); // コンパイルは通るが実行時に壊れる
3any は他の変数に入り込む
any の値は number 型の変数にもエラーなく代入できてしまい、型の保証が周囲に広がって崩れます。数値のつもりの計算が実行時には文字列連結になる、any の「伝染」の典型例です。
let rawInput: any = "100"; // 中身は文字列
// any は number 型の変数にも代入できてしまう
const orderCount: number = rawInput;
// 数値のつもりで計算すると、実行時は文字列連結になる
console.log(orderCount + 50); // 150 ではなく "10050"
// コンパイルは一度も警告しないまま、結果だけが壊れる
4JSON.parse の結果は any
実務で any に出会う代表例が JSON.parse の戻り値です。パース結果はどんなプロパティにアクセスしてもコンパイルが通り、存在しないプロパティの参照も素通りしてしまうことを確かめます。
const jsonText: string = '{"price": 300, "label": "コーヒー"}';
// JSON.parse の戻り値は any なので、何のチェックもなく使えてしまう
const parsedData = JSON.parse(jsonText);
console.log(parsedData.label);
console.log(parsedData.price * 2);
// 存在しないプロパティへのアクセスもコンパイルは通る
console.log(parsedData.discount); // undefined
5実行時エラーになって初めて気づく
any のコードは、間違っていても実行するまで壊れたことが分かりません。数値に対する文字列メソッドの呼び出しが実行時エラーになる様子を try で観察し、「新しいコードでは any を避ける」理由を体感します。
const numericData: any = 123;
console.log("コンパイル時のチェックはすべて素通りします");
try {
// number に toUpperCase はないので、実行した瞬間に壊れる
numericData.toUpperCase();
} catch {
console.log("実行時エラーが発生しました");
}
console.log("any の間違いは実行するまで分からない");