implicitly has an 'any' type の原因と直し方
関数のパラメータに型注釈を付けないと、strictモードのTypeScriptは型を推論できず「暗黙のany」としてエラーにします。anyは型チェックを無効化してしまうため、TypeScriptの利点を守るために既定で禁止されています。
エラーメッセージの読み方
main.ts(1,17): error TS7006: Parameter 'n' implicitly has an 'any' type.
main.ts- ファイル名
1- 行番号
17- 列番号 — この位置でtscが検査に失敗しました
TS7006- エラーコード — 検索するとTypeScriptの解説が見つかります
Parameter 'n' implicitly has an 'any' type.- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 function double(n ) { ^ 2 return n * 2; 3 } 4 console.log(double(5));
strictモードでは、パラメータの型が推論できない場合に型注釈が必須です。n: numberのように明示します。
直し方: n を n: number にします。
パターン2
1 function greet(name ) { ^ 2 return "Hello, " + name; 3 } 4 console.log(greet("Al"));
nameパラメータに型注釈が無いため、anyとして扱われエラーになります。name: stringと明示します。
直し方: name を name: string にします。
パターン3
1 function sum(items: number[], start ) { ^ 2 return items.reduce((a, b) => a + b, start); 3 } 4 console.log(sum([1, 2, 3], 0));
2つ目のパラメータstartにも型注釈が必要です。片方だけ型を書いても、残りは自動的には推論されません。
直し方: start を start: number にします。
パターン4
1 function triple(n ) { ^ 2 return n * 3; 3 } 4 console.log(triple(2));
パラメータnに型注釈がないため、暗黙のany型としてエラーになります。
直し方: n を n: number にします。
パターン5
1 function shout(msg ) { ^ 2 return msg.toUpperCase(); 3 } 4 console.log(shout("hi"));
msgパラメータに型注釈が必要です。msg: stringと明示します。
直し方: msg を msg: string にします。
よくある誤解
「型を書かなければJavaScriptと同じように動くはず」という考えは、strictモードのTypeScriptには通用しません。型注釈の省略が許されるのは、tscが文脈から型を推論できる場合だけです。
実務での勘所
この検査はtsconfig.jsonのnoImplicitAny(strict:trueに含まれる設定の1つ)が担当しています。anyが危険視される理由は、単に「型が緩い」だけでなく、any型の値はどんな型の変数にも代入でき、逆にどんな型の値もany型の変数として受け取れてしまう、型チェックの抜け道になっている点です。1つのany型の値がコード中を伝播すると、そこから先の型チェックが連鎖的に効かなくなるため、strictモードでは意図しないanyの発生を早期に検出するようにしています。