0

我正在使用闭包编译器,并且我想断言两个类具有最少的方法/属性集。为此,我创建了一个界面......例如:

goog.scope(function() {



/**
 * @interface
 */
namespace.Foo = function() {};
var Foo = namespace.Foo


/**
 * @return {string}
 */
Foo.prototype.bar = function() {};

});  // goog.scope

问题是它Foo.prototype.bar没有return声明,所以即使闭包本身完全满意,闭包 linter 也会抱怨。

Line 38, E:0218: Found @return JsDoc on function that returns nothing
Line 56, E:0218: Found @return JsDoc on function that returns nothing

当然,如果我删除了@return注释,那么闭包就会不高兴,并会抛出有关覆盖方法并返回与接口不兼容的内容的警告。我不想禁用此警告,因为这几乎就是我首先编写接口的原因(以确保所有实现者都在做他们需要做的事情)。

是否有任何神奇的咒语可用于在此文件中的关闭 linter 中禁用该警告?

4

3 回答 3

2

事实证明,答案只是等待在closure-linter源代码/测试用例中被发现:

他们写了类似的东西:

/**
 * Sample interface to demonstrate correct style.
 * @interface
 */
sample.GoodInterface = function() {
};


/**
 * Legal methods can take parameters and have a return type.
 * @param {string} param1 First parameter.
 * @param {Object} param2 Second parameter.
 * @return {number} Some return value.
 */
sample.GoodInterface.prototype.legalMethod = function(param1, param2) {
};

这显然在他们的测试用例中很好。这和我的有什么区别?好吧,他们没有goog.scope用来做任何混叠。当我删除别名时(例如

/**
 * @return {string}
 */
namespace.Foo.prototype.bar = function() {};

闭包 linter 现在足够聪明,可以确定它Foo是接口的一部分,并且不需要方法中的任何实现。惊人的。

于 2016-03-29T22:04:54.210 回答
1

尝试以下操作:

/**
 * @return {string}
 */
namespace.Foo.prototype.bar;

接口根本不需要任何函数体。我怀疑它们只对编译器可见,甚至根本不会出现在您的代码中。

或者,因为您正在使用goog.scope,您可以编写:

/**
 * @return {string}
 */
Foo.prototype.bar;
于 2016-03-30T19:33:29.780 回答
0

您可以尝试@abstract标签,这可能会有所帮助。如果没有,闭包编译器可以抑制警告。我认为这样的事情会奏效。

/**
 * @return {string}
 * @suppress {missingReturn}
 */
 Foo.prototype.bar = function() {};

祝你好运!

于 2016-03-29T22:01:56.850 回答