すべてのカスタムタイプを個別のファイルで定義できますか(例:types.jsdoc
)、アプリケーション全体で再利用できるように?それを行う正しい方法は何ですか?
/**
* 2d coordinates.
* @typedef {Object} Coordinates
* @property {Number} x - Coordinate x.
* @property {Number} y - Coordinate y.
*/
モジュールでタイプを定義できます(例:typedefs.js
)。このモジュールにはJSDoctypdefが含まれており、未使用のプロパティを簡単にエクスポートできます。
// typedefs.js
/**
* @typdef foo
* @property {string} bar
*/
// etc.
exports.unused = {};
これを使用するには、次のtypdefを参照する必要があるモジュールをインポートします。
const typedefs = require("./typedefs");
/** @type {typedefs.foo} */
const fb = { bar: "hello" };
typedefs.js
に@module
または@namespace
として注釈を付けることをお勧めします。 「tsd-jsdoc」を使用してtypes.d.ts
ファイルを生成し、TypeScriptがモジュールと名前空間を解釈する方法のために、typedefs.js
ファイルに@namespace
として注釈を付け、各typedefをその名前空間のメンバーとして文書化しました。
/**
* @namespace typedefs
*/
/**
* @typedef foo
* @property {string} bar
* @memberof typdefs
*/
お役に立てば幸いです。
VSCodeを試してみましたが、エディターで別のファイルを開いた場合にのみ機能します。そうでない場合、外部typedefは任意のように入力されます
私は通常、プロジェクトで同様のことを行いますが、ファイルに名前を付けるために拡張子.js
を使用する点が異なります。 Webstormは完全に機能し、タイプをチェックしてオートコンプリートを正常に実行できます。 .jsdoc
拡張子(チェックしたばかり)を認識しないため、ファイルにコードステートメントが含まれていない場合でも.js
に固執します。
これはTypeScriptフレーバーのJSDoc固有の回答ですが、 トリプルスラッシュディレクティブ を使用して別のファイルからすべてのタイプを「インポート」することに成功しています。これには、リンターやバンドラーを混乱させる可能性のある未使用のimport
を実際に追加しないという利点があります。
次のように、共有タイプをtypedefs.js
という1つのファイルに入れています。
// typedefs.js
/**
* @typedef {Object} Foo
* @property {string} bar
*/
/**
* @typedef {Object} Baz
* @property {number} buzz
*/
次に、他のファイルで/// <reference path="typedefs.js" />
を使用して、次のような共有タイプにアクセスします。
// randomThing.js
/// <reference path="typedefs.js" />
/**
* Turn a Foo into a Baz
*
* @param {Foo} a
* @return {Baz}
export function (a) {
return { buzz: a.bar.length };
}
ただし、注意が必要なのは、typedefs.js
がコメントで参照されているだけで、ロールアップなどのバンドラーがそれを完全に見逃していることです。そのため、いくつかの定数をエクスポートし、少なくとも1つの場所にインポートする古いconsts.js
と組み合わせています。そうすれば、typedefは引き続きロールアップ出力に含まれます。
他の誰かがこれがお役に立てば幸いです。
p.s.ロールアップは、ツリーの揺れのためにtypedefs.js
がある場合でも、純粋なJSDoc import './typedefs.js'
ファイルを完全に除外します。 --no-treeshake
を使用してロールアップを実行し、これらのコメントをロールアップ出力に保持する必要があります。