IT-Q

社内の古いライブラリを import したら、「Could not find a declaration file for module」というエラーが出ました。@types も無いようです。どうしますか。

@types が無ければ、.d.ts に declare module "名前" { ... } を書き、使う関数の型だけ宣言します。中身を書かない1行の宣言はエラーを消すだけで、import はすべて any になります。

面接官が見ているのは型定義が無いときに、検査を失わずに型を足せるか。

よくある答えと、面談でどう見られるか

  • .d.ts に declare module "ライブラリ名" { ... } を書き、実際に使う関数の型だけを宣言する
    その通りです。使う範囲だけでも型を書けば、呼び出し側は検査されます。
  • .d.ts に declare module "ライブラリ名"; と1行だけ書く
    エラーは消えますが、そのモジュールからの import はすべて any になります。急場しのぎとしては使えますが、検査はされません。
  • import の行に // @ts-ignore を付ける
    エラーは消えますが、取り込んだものは any のままで、何の検査もされません。
  • noImplicitAny を無効にする
    このエラーは消えますが、プロジェクト全体で暗黙の any が許されてしまいます。

模範解答

.d.ts に、そのモジュールの型を自分で宣言します。

  // types/legacy-lib.d.ts
  declare module "legacy-lib" {
    export function formatPrice(value: number, currency: string): string
  }

全部を書く必要はなく、プロジェクトで実際に使っている関数から書けば足ります。宣言した範囲は、呼び出し側で引数の間違いが検査されます。

declare module "legacy-lib"; と中身を書かない形(shorthand)もあり、エラーはすぐ消えますが、公式のリリースノートのとおり、そこからの import はすべて any になります。とりあえず動かすための一時しのぎにとどめ、使う部分から型を足していきます。

対象: TypeScript 5.x〜7.0 照合した一次資料: 公式ドキュメント 照合: 2026-10-25 最終更新: 2026-10-25
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。

ここからどう深掘りされるか

この問いに答えられた場合、面談は次の質問に進みます。