深夜のビルド失敗
夜の10時。新しいサードパーティライブラリを使った機能を完成させたばかりです。頭の中では完璧に思えますが、ビルドを実行するとターミナルが真っ赤なテキストで溢れかえります。原因は?TypeScript特有の門前払いエラーです:
Could not find a declaration file for module 'module-name'. '/path/to/module.js' implicitly has an 'any' type.
VS Codeのimport文の下に、イライラさせる赤い波線が表示されているはずです。TypeScriptは実質的にこう言っています。「このJavaScriptコードは認識できるけれど、そのオブジェクトがどのような構造をしているかわからない。推測はしないので、ここで処理を停止する」と。以下に、ワークフローを再開してコードをデプロイするための解決策を紹介します。
クイックデバッグチェックリスト
無理に修正しようとする前に、以下の3点を確認してTypeScriptがエラーを出している理由を探りましょう:
- ソースを確認する:
node_modules/module-nameの中を見てください。index.d.tsファイルやpackage.jsonにtypesフィールドがなければ、そのライブラリは純粋なJavaScriptで書かれています。 - DefinitelyTypedを検索する: 多くの古いJavaScriptライブラリには、コミュニティがサポートする型定義が存在します。
- パスを確認する: これがローカルファイルの場合、
tsconfig.jsonのbaseUrlを再確認してください。タイポがあると、ローカルファイルが欠落した外部モジュールのように見えることがあります。
解決策1:DefinitelyTypedを使用する(最善の策)
多くの場合、そのライブラリをTypeScriptで使用しているのはあなただけではありません。lodashやreact-datepickerのような人気のあるツールは型定義を同梱していませんが、コミュニティが@types名前空間で型を維持しています。これなら10秒で修正可能です。
# 'module-name' を特定のライブラリ名に置き換えてください
npm install --save-dev @types/module-name
# yarn または pnpm を使用している場合
yarn add -D @types/module-name
pnpm add -D @types/module-name
インストールが完了すると、エラーは消えるはずです。もしVS Codeがまだエラーを表示し続ける場合は、Ctrl+Shift+Pを押してTypeScript: Restart TS Serverを選択し、TypeScriptサーバーを再起動してください。
解決策2:カスタム宣言ファイルを作成する
知名度の低いライブラリや内部ライブラリを使用している場合、@typesパッケージが存在しないことがあります。この場合、TypeScriptに警告を止めるよう伝える必要があります。モジュール全体をany型として扱う「短縮形」の宣言を作成できます。完全に安全ではありませんが、動作します。
srcディレクトリの中にtypesフォルダを作成します。declarations.d.tsという名前のファイルを作成します。- 次の1行を追加します:
// src/types/declarations.d.ts
declare module 'module-name';
TypeScriptは通常、.d.tsファイルを自動的に認識します。もし認識されない場合は、tsconfig.jsonにtypesフォルダが含まれているか確認してください:
// tsconfig.json
{
"include": ["src/**/*", "src/types/*.d.ts"]
}
解決策3:SVGとCSSモジュールの処理
コード以外のアセットをインポートする際にも、このエラーがよく発生します。TypeScriptはコードを期待しているため、.pngや.module.cssをインポートすると混乱してしまいます。同じdeclarations.d.tsファイルで、これらをグローバルに解決できます:
// CSSモジュールの処理
declare module '*.module.css' {
const classes: { [key: string]: string };
export default classes;
}
// 画像インポートの処理
declare module '*.svg' {
const content: any;
export default content;
}
解決策4:「今すぐデプロイが必要」な場合のオプション
締め切りが迫っており、特定のインポート1つだけが失敗している場合は、最終手段(エスケープハッチ)を使用します。これにより、その特定の行のエラーを無視できます。これに頼りすぎるとTypeScriptを使用する意味がなくなってしまうため、控えめに使用してください。
// @ts-ignore
import { UntypedComponent } from 'some-old-library';
検証
赤い線が消えたからといって、正常に動作していると思い込まないでください。以下の手順で確認しましょう:
- 手動チェックを実行する:
npx tsc --noEmitを実行します。これにより、ファイルを生成せずにプロジェクト全体の型エラーをテストできます。 - キャッシュをクリアする: エラーが解消されない場合は、
.nextやdistフォルダを削除して開発サーバーを再起動してください。古い型定義がキャッシュに隠れていることがあります。
結論
型エラーは、プロジェクトに「死角」があることを示していることが多いです。解決策2は作業を再開する最も速い方法ですが、そのライブラリに対する「安全網」を取り除いてしまいます。そのライブラリがアプリのコア部分である場合は、.d.tsファイルにいくつかのインターフェースを記述することを検討してください。手間はかかりますが、TypeScriptを使う価値であるオートコンプリートと保護機能を得ることができます。

