takashiskiのブログ

覚書の殴り書き

非モジュールの複数ファイルに分割されたJavaScriptファイル間で型補完を行う

前提

  • 非モジュールであること
    • ESModuleやCommonJSモジュールではなく、scriptタグやgulpで結合する全てグローバルに存在する環境
  • VSCodeを使っていること
  • jsdocが書いてあること

やりかた

現在のファイルmain.jsに対して、同じ階層に型情報を読み込みたいファイルnot-module001.jsがあるとします その場合は、ファイルの任意の場所に以下のコメントを挿入します

/**@typedef {import("./not-module001.js")*/

挙動

そのファイルに記載されたjsdocを全て読み込み、同じスコープに存在するかのようにふるまってくれます。 少なくともクラス、オブジェクト、関数あたりは読めてます。

注意

この構文で別のファイルのjsdocに記載された型情報を補完することができています(2025年1月現在)。 しかし、何故この動きをしているのかは全く分かっていないです。

わかっていること

  • ts-serverの機能を使っていること
  • tsのjsdocの拡張構文を使っていること
  • @typeでは同様の動きをしないこと

わかっていないこと

  • jsdocの文法、TypeScriptのjsdoc拡張文法どちらの使い方としてもそんな記載がなさそうなこと
    • たぶん{import()} はモジュールのみを想定しているので、非モジュールに対する使い方の言及が存在しない?
    • import().AAAみたいなことしても全型情報が読み込まれるのはそれによる気がする

別のやり方

ディレクトリ以下のすべてのjsファイルからglobal.d.tsファイルを生成することでよりオフィシャルになると考えられます。

参考資料