JsDoc和WebStorm:参考导出

JsDoc and WebStorm: Refer to exports

本文关键字:参考 WebStorm JsDoc      更新时间:2023-09-26

我有这样一个模块:

/**
 * Do something with target. A bunch of these methods
 * @param target
 */
function doJob(target) {
    target.something = 'value';
}
module.exports = {
    doJob
};

WebStorm正确地识别出doJob是由这个模块导出的,并且给出了很好的智能感知。

现在我想添加一个工具,这样我就可以将所有导出的方法与目标绑定。

module.exports = {
    doJob
};
const oldExports = Object.assign({}, module.exports);
module.exports.bind = function (target) {
    const newExports = {};
    for (var key in oldExports) {
        newExports[key] = oldExports[key].bind(null, target);
    }
    return newExports;
};

这个想法是,消费者可以获得正常的导出并以过程风格使用函数,或者他们可以获得相同的函数集,绑定到他们的本地target

我的问题是现在,我如何告诉WebStorm(使用JsDoc), bind()函数的返回值与module.exports相同?

我尝试过的事情:

  • @returns {module.exports}
  • @returns {exports}
  • 声明@module在顶部,然后@returns符号
  • @alias -不幸的是,这似乎完全接管了符号,所以现在我不再有任何在module.exports
我意识到这不是世界末日。但是我觉得我就快把所有的事情都安排好了,这快把我逼疯了。

有谁知道在JsDoc中做这件事的正确方法是什么,加上WebStorm/PhpStorm将知道如何使用它的额外好处?

好的,我想我明白了。

function doJob(target) {
    target.something = 'value';
}
class JobsModule {
    constructor() {
        Object.assign(this, /** @lends {JobsModule.prototype} */ {
            doJob,
            // other exports go here
        });
    }
}
module.exports = new JobsModule();
/**
 * @return {JobsModule}
 */
module.exports.bind = function (target) {
    const newExports = {};
    for (var key in new JobsModule()) {
        newExports[key] = oldExports[key].bind(null, target);
    }
    return newExports;
};

将所有东西声明为类,然后在需要使用它的时候创建它。效率不高,但可能没什么大不了的。