这是我的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
定义绑定。
答案 0 :(得分:8)
除非我弄错了,否则我看不出被提议的解决方案如何工作。
JSDoc中没有类似@typedef {MyNewType} MyNewType
的东西,而是@typedef {Object} MyNewType
(用于定义基本类型)(see docs)
此外,在给定的解决方案中,注释都混合在一起。例如,@param
仅用于函数参数以及声明特殊函数类型(see docs)时
最后但并非最不重要的一点是,没有冒犯,但建议的解决方案也是错误的,因为它混合了var MyNewType
类型声明(具有两个参数的函数和具有两个属性的返回对象)和实际的返回值声明(所述对象的两个属性)。除了不包括返回的类型所需的括号之外。
编辑:哦,我忘记了logFirst
不是{em>不是number
而是Function
,这是OP同事提出的解决方案中的另一个错误
我真的无法理解为什么人们会投票赞成这种破损的解决方案...
我绝不是JSDoc的专家,但我认为以下解决方案应该为新的SO访问者解决所有问题:
(注意:我不明白为什么我们永远都不需要logFirst和logSecond函数使用两个不同的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
};
};
答案 1 :(得分:1)
以防万一,因为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
};
};
这对我们来说很好。