0

我正在使用JsDoc3Closure Compiler。我使用了一个JsDoc 模板,它为我输出 JSON,以便使用自定义脚本从中生成 HTML。

我有一个返回自定义类的函数(但我没有也不需要构造函数),并且我希望能够记录它(函数)以及返回对象中存在的函数。

myLib.defer = function() {

    return {
        'then':    function() {},
        'resolve': function() {},
        'reject':  function() {},
        'notify':  function() {},
        'promise': function() {}
    };

};

我该如何记录?我没有构造函数,也不需要构造函数。我不太关心记录“类”(我不需要一个,此外,返回的对象记录在@return这个函数中),我唯一需要的是记录存在于返回了 object,所以它们最终会出现在 JsDoc 的 JSON 输出中供我抓取。

另外,我使用的是 Closure Compiler 的AVANCED_OPTIMIZATIONS模式,所以如果任何变通方法的副作用(例如无用的代码)会被抑制,这是一个很好的变通方法。

4

2 回答 2

1

不幸的是,没有办法做到这一点看起来不尴尬,但这是可行的。

首先,正如乍得提到的,可以记录一个没有带有接口的构造函数的类。它看起来像这样:

/**
 * Description of the Deferred interface.
 * @interface Deferred
 */
function Deferred() {}

并且可以像这样记录它的方法(例如):

/**
 * Returns a Promise
 * @function Deferred.promise
 * @return {Promise} A Promise.
 */
Deferred.prototype.promise = function() {};

然后,在返回无构造函数类的函数上,像这样注释返回:

myLib.defer = function() {

    /** @type {Deferred} */
    return {
        'then':    function() {},
        'resolve': function() {},
        'reject':  function() {},
        'notify':  function() {},
        'promise': function() {}
    };

};

但是,这只会通过 Closure Compiler;它不会被JsDoc3 JSON 导出模板(也可能是常规模板)正确转换,所以我们需要这个@class注释(CC 忽略):

/**
 * Description of the Deferred interface.
 * @interface Deferred
 * @class Deferred
 */
function Deferred() {}

有了所有这些,我们的文档将正确生成,并且我们的代码将编译为与之前相同的 - 所有样板在编译时都作为死代码被删除。

更新:正如乍得提到的,如果您尝试直接实例化非接口,您不会收到警告,这可能很糟糕,您可能不喜欢这样(如果实例化,接口抛出错误)。

解决此问题的一种方法是将接口构造函数@private设置为@const对象文字,如他对该问题的回答中所述。

于 2012-11-28T01:11:42.457 回答
0

重复的问题。请参阅如何在 JavaScript 中记录返回

在这种情况下,由于它看起来像一个库,您可能需要声明和使用一个接口。有关示例,请参阅jQuery externs

于 2012-11-27T21:40:06.810 回答