TypeScript で「Parameter implicitly has an 'any' type」(TS7006) が解決できない
noImplicitAny が有効で、引数に型注釈が無く型推論もできないためです。
引数へ明示的に型を付けるのが基本で、コールバックは文脈から型が付くよう書きます。
#typescript#noimplicitany#ts7006#any#types
要約
Parameter 'x' implicitly has an 'any' type.(TS7006)は、noImplicitAny(strict 配下)が有効なときに、引数の型が注釈も推論もできず暗黙の any になっていることを示します。
原則は引数へ明示的な型を付けることで、コールバックは推論が効く書き方に直すと解消します。
よくある原因
- noImplicitAny 有効:
strict: trueを入れるとnoImplicitAnyも有効になり、注釈の無い引数がエラーになる。 - 独立した関数宣言:
function f(x) {}のように単独で定義した関数は呼び出し側から型が伝播しない。 - 型のない JS 連携:
@typesの無いライブラリのコールバック引数は推論材料が無く any になる。
解決策
1. 引数に型注釈を付ける
最も素直な解決策です。
function greet(name: string): string {
return `Hello, ${name}`;
}利用できる型注釈は公式ハンドブックにまとまっています。
2. 文脈的型付けを効かせる
コールバックは「型の付いた関数の引数」として渡せば推論されます。
const nums = [1, 2, 3];
nums.map((n) => n * 2); // n は number と推論されるmap の型から n: number が文脈的に決まるため、注釈は不要になります。
3. 設定で段階移行する(暫定)
大量の既存コードを一度に直せない場合のみ、tsconfig.json で一時的に緩めます。
{
"compilerOptions": {
"noImplicitAny": false
}
}ただし型安全性が下がるため恒久策にはせず、noImplicitAny の意味は公式の tsconfig リファレンスを確認しつつ段階的に型を付けて戻してください。