AIが型定義エラーを見過ごす理由と、プロンプトで解決する方法
プログラミングをしていると、AIに「これで大丈夫だよ」と言われたコードが、実は問題を含んでいることがあります。特にTypeScriptの型のインポート方法については、AIが間違いを見過ごすことが意外と多いです。
この記事では、なぜAIがこうしたエラーを見逃すのか、そしてプロンプトを工夫することでどう対策できるのかを説明します。
AIが型インポートエラーを見過ごす理由
理由1: 型チェックと実行時動作の混同
TypeScriptには「型」と「値」という2つの世界があります。
// これはTypeScriptとしては問題なく動く
import { User } from './types'
// 本来はこう書くべき
import type { User } from './types'
TypeScriptのコンパイラは、import { User } を見ても「型として使われている」と判断できます。つまり、コンパイルは通ります。
AIは「コンパイルが通るかどうか」で判断することが多いため、「動くけど最適ではない」コードを許容してしまいます。
理由2: ファイル単体での判断
AIは基本的に、今見ているファイルだけで判断しています。
プロジェクト全体を見渡して「この型は他のファイルでどう使われているか」「このインポート方法はプロジェクトの方針に合っているか」といった判断は苦手です。
人間でも、1つのファイルだけ見ていたら、全体の設計ルールを見落とすことがあるのと同じです。
理由3: ESLintなどのツールに依存していない
プログラミングの世界には、コードの品質をチェックする自動ツールがあります。代表的なのがESLintです。
ESLintは、プロジェクトで決めたルール通りにコードが書かれているかを自動でチェックしてくれます。
AIはこうした自動ツールを使わず、手動でルールを適用しようとします。そのため、見落としが発生します。
人間でも、チェックリストなしで完璧にチェックするのは難しいですよね。AIも同じです。
理由4: 最新の設定への認識不足
TypeScriptは進化し続けています。新しいバージョンでは、より厳密なチェックができる設定が追加されます。
例えば、verbatimModuleSyntax という設定は、TypeScript 4.5以降で追加されました。この設定をオンにすると、型のインポートは必ず import type を使う必要があります。
すべてのAIが、常に最新の設定やベストプラクティスを完璧に把握しているわけではありません。
実装的な解決策
問題の原因がわかったところで、どう対策すればいいかを説明します。
対策の基本的な考え方
対策には2つのアプローチがあります。
- プロジェクト側の設定: ESLintやTypeScriptの設定で自動チェック
- プロンプト側の工夫: AIに明示的に指示を与える
理想は両方を組み合わせることですが、この記事では特に「プロンプトで解決する方法」に焦点を当てます。
なぜプロンプトで対策するのか
プロジェクトの設定を変更するには、チーム全体の合意や既存コードの修正が必要です。すぐには実行できないこともあります。
一方、プロンプトは今すぐ使えます。AIとのやり取りを少し工夫するだけで、エラーを減らせます。
プロンプトに練り込むべき要素
AIに型インポートのエラーを見逃させないためには、プロンプトに以下の要素を含める必要があります。
要素1: プロジェクトのルールを明示する
AIは、あなたのプロジェクトのルールを知りません。明示的に伝える必要があります。
このプロジェクトでは、TypeScriptの型インポートには必ず `import type` を使用してください。
要素2: 具体的な設定を伝える
プロジェクトのTypeScript設定を伝えることで、AIがより正確に判断できます。
tsconfig.jsonには "verbatimModuleSyntax": true が設定されています。
要素3: チェック項目を指示する
AIに「何をチェックすべきか」を明示します。
コードを提案する前に、以下を確認してください:
- 型のインポートには `import type` を使用しているか
- 値のインポートと型のインポートが混在していないか
要素4: 既存のルールや設定ファイルを参照させる
プロジェクトにESLintの設定がある場合、それを参照させます。
.eslintrc.jsonの "@typescript-eslint/consistent-type-imports" ルールに従ってください。
実践: 改善されたプロンプトの例
基本的なプロンプト(改善前)
TypeScriptでユーザー管理機能を実装してください。
このプロンプトでは、AIは型インポートの方法について何も考慮しません。
改善されたプロンプト(改善後)
TypeScriptでユーザー管理機能を実装してください。
【重要な制約】
- このプロジェクトでは、TypeScriptの型インポートには必ず `import type` を使用すること
- tsconfig.jsonには "verbatimModuleSyntax": true が設定されています
- 値のインポートと型のインポートは明確に分離すること
【コード提案前のチェックリスト】
1. すべての型インポートで `import type` を使用しているか確認
2. 値と型のインポートが同じimport文に混在していないか確認
3. インターフェースや型エイリアスのインポートが適切か確認
上記を確認した上で、コードを提案してください。
このプロンプトを使うことで、AIは型インポートに注意を払うようになります。
さらに詳細なプロンプトテンプレート
プロジェクトの状況に応じて、さらに詳細な指示を加えることができます。
TypeScriptで[実装したい機能]を実装してください。
【プロジェクト環境】
- TypeScript 5.0以上
- tsconfig.jsonの設定:
- "verbatimModuleSyntax": true
- "strict": true
- ESLintルール:
- "@typescript-eslint/consistent-type-imports": "error"
【型インポートの厳格なルール】
1. 型のインポートには必ず `import type` を使用すること
2. 値と型を同じimport文で混在させないこと❌ 悪い例: import { User, type UserRole } from './types'
✅ 良い例:
import type { User, UserRole } from './types'
import { createUser } from './types'
3. 以下の場合は必ず `import type` を使用:
- インターフェース
- 型エイリアス
- ジェネリック型パラメータとして使用する場合
【コード提案の流れ】
1. まず実装の方針を説明
2. 型定義を提案(import typeの使用を確認)
3. 実装コードを提案
4. 最後に型インポートが正しいか再確認
では、実装をお願いします。
プロンプトの効果を高めるコツ
コツ1: プロジェクトのルールを文書化しておく
プロンプトに毎回同じことを書くのは大変です。プロジェクトのルールを文書化し、それを参照する形にします。
このプロジェクトのコーディング規約(CONTRIBUTING.md)に従ってください。特に、TypeScriptの型インポートルールを厳守してください。
コツ2: 失敗例を示す
AIに「これはダメ」という例を見せることで、理解が深まります。
【避けるべきパターン】❌ import { User } from './types' // 型なのにimport typeを使っていない❌ import { createUser, type User } from './types' // 値と型の混在
【推奨パターン】✅ import type { User } from './types'
✅ import { createUser } from './types'
コツ3: チェックリストを明示する
AIに「確認すべき項目」を明示することで、見落としを減らせます。
コードを提案する前に、必ず以下をチェックしてください:
□ すべての型インポートで `import type` を使用しているか
□ 値と型のインポートが分離されているか
□ 未使用のインポートがないか
□ インポートの順序は適切か(type → 値の順)
コツ4: 繰り返し指示する
重要なルールは、プロンプトの中で複数回言及します。
TypeScriptで実装してください。
【最重要】型インポートには必ず `import type` を使用すること
[実装の詳細]
【再確認】提案するコードで、すべての型インポートが `import type` になっているか確認してください。
プロンプト以外の補完的な対策
プロンプトだけでは完璧ではありません。以下の対策も併用することをおすすめします。
1. ESLintの設定
プロジェクトにESLintを導入し、型インポートのルールを設定します。
{
"rules": {
"@typescript-eslint/consistent-type-imports": "error"
}
}
2. TypeScriptの厳格な設定
tsconfig.json で厳格なチェックを有効にします。
{
"compilerOptions": {
"verbatimModuleSyntax": true,
"strict": true
}
}
3. CI/CDでの自動チェック
コードをプッシュしたときに、自動でチェックが走るようにします。
4. AIに生成されたコードのレビュー
AIが生成したコードは、必ず人間がレビューします。特に型インポートは重点的にチェックします。
まとめ
AIが型定義エラーを見過ごす理由は、主に以下の4つです:
- コンパイルが通るコードを「問題ない」と判断してしまう
- プロジェクト全体を見渡せない
- 自動チェックツールを使っていない
- 最新の設定を完璧に把握していない
これらの問題は、プロンプトを工夫することである程度解決できます。
効果的なプロンプトの要素:
- プロジェクトのルールを明示する
- 具体的な設定を伝える
- チェック項目を指示する
- 失敗例と成功例を示す
プロンプトだけでなく、ESLintやTypeScriptの設定、CI/CDでの自動チェックなど、複数の対策を組み合わせることで、より確実にエラーを防げます。
AIは強力なツールですが、完璧ではありません。人間が適切に指示を与え、生成されたコードをレビューすることが重要です。