これが私のjsdoc宣言です。
MyNewType.logFirst
プロパティが実際にlogFirst
関数を参照するように、どのように調整する必要がありますか。これについては、以下で注釈を付けます。
// my-new-type.js
/**
* MyNewType definition
* @typedef {Object} MyNewType
* @property {function} logFirst
* @property {function} logSecond
*/
/**
* @param {number} first
* @param {number} second
* @returns MyNewType
*/
module.exports = (first, second) => {
/**
* logs first argument
* @param {number} times
*/
function logFirst(times) {
for (let i = 0; i < times; i++) {
console.log(first);
}
}
/**
* logs second argument
* @param {number} times
*/
function logSecond(times) {
for (let i = 0; i < times; i++) {
console.log(second);
}
}
return {
logFirst,
logSecond
};
};
このような「工場」構造を維持することが重要です。
IDEにMyNewType.logFirst
をlogFirst
定義にバインドさせたい。
それが誰かを助ける場合に備えて、OPは私の同僚です:
// my-new-type.js
/**
* MyNewType definition
* @typedef {MyNewType} MyNewType
* @param {number} first
* @param {number} second
* @property {function} logFirst
* @property {function} logSecond
* @returns MyNewType
*/
var MyNewType = module.exports = (first, second) => {
/**
* logs first argument
* @typedef {number} logFirst
* @param {number} times
*/
function logFirst(times) {
for (let i = 0; i < times; i++) {
console.log(first);
}
}
/**
* logs second argument
* @param {number} times
*/
function logSecond(times) {
for (let i = 0; i < times; i++) {
console.log(second);
}
}
return {
logFirst,
logSecond
};
};
これは私たちにとってうまくいきました。
私が間違っていない限り、賛成の解決策がどのように機能するかはわかりません。
JSDocには@typedef {MyNewType} MyNewType
のようなものはありませんが、@typedef {Object} MyNewType
(基本型を定義するため)( ドキュメントを参照 )
また、特定のソリューションでは注釈がすべて混同されています。たとえば、@param
は関数パラメーター専用であり、特殊な関数タイプを宣言する場合( ドキュメントを参照 )
最後に大事なことを言い忘れましたが、var MyNewType
型宣言(2つのパラメーターを持ち、2つのプロパティを持つオブジェクトを返す関数)と実際の戻り値宣言(2つのプロパティ)が混同されているため、違反はありませんが、賛成の解決策も間違っています。上記のオブジェクトの)。返されるタイプの周りに必要な括弧が含まれていないことに加えて。
編集:ああ、私はlogFirst
がではなくnumber
ではなくFunction
であることを忘れました。 OPの同僚によって提案されました。
なぜ人々がそのような壊れた解決策に賛成するのか私は本当に理解できません...
JSDocの専門家ではありませんが、次の解決策ですべてを修正する必要があると思います、新しいSO訪問者) :
(注:logFirst関数とlogSecond関数はまったく同じ署名を持っているため、2つの異なるtypedefが必要になる理由はわかりませんが、JFFは両方を指定しました)
/**
* Declare our "logFirst" type (which is a function)
*
* @callback TypeFnLogFirst
* @param {number} times
* @returns {void}
*/
/**
* Declare our "logSecond" type (which is a function)
*
* @callback TypeFnLogSecond
* @param {number} times
* @returns {void}
*/
/**
* Declare our returned type
*
* @typedef {Object} TypeObjTwoFns
* @property {TypeFnLogFirst} logFirst
* @property {TypeFnLogSecond} logSecond
*/
/**
* Declare our "MyNewType" type (which is a function)
* with two parameters
* and a return value (object literal of type TypeObjTwoFns)
* (==> where the magic happens)
* Note that "[at]typedef Function" is the same as "[at]callback" (as per the docs)
*
* @typedef {Function} TypeFnNewType
* @param {*} first
* @param {*} second
* @returns {TypeObjTwoFns}
*/
/** @type {TypeFnNewType} MyNewType */
var MyNewType = (first, second) => {
/** @type {TypeFnLogFirst} logFirst */
function logFirst(times) {
for (let i = 0; i < times; i++) {
console.log(first);
}
}
/** @type {TypeFnLogSecond} logSecond */
function logSecond(times) {
for (let i = 0; i < times; i++) {
console.log(second);
}
}
return {
logFirst,
logSecond
};
};