0

Я использую компилятор замыкания, и у меня есть два класса, которые, как я хотел бы утверждать, имеют минимальный набор методов/свойств. Для достижения этой цели, я создал интерфейс ... т.д .:Закрытие linter warning о интерфейсах

goog.scope(function() { 



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


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

}); // goog.scope 

Проблема заключается в том, что Foo.prototype.bar не имеет return заявления, поэтому закрытие ЛИНТЕР жалуется, даже если само закрытие полностью довольно.

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 только в этом файле?

+1

Это может быть немного странно, что ЛИНТЕР и компилятор не согласен, но главный вопрос должен быть: Почему вы реализовать метод, который должен возвращать строку но не так ли? – Bergi

+0

@Bergi - Для этого используются интерфейсы. На самом деле, если вы попытаетесь что-то поместить в интерфейс, закрытие будет кричать на вас. В основном интерфейс (или запись с различной степенью проверки типов) описывает объект, который может передаваться различным методам, но программист должен создать конкретную реализацию, которая удовлетворяет интерфейсу. – mgilson

+0

Да, конечно. Я предполагаю, что я просто недостаточно разбираюсь в компиляторе закрытия, этот интерфейс * декларация * слишком похож на реализацию для меня ... (а может быть, и для линтера). – Bergi

ответ

1

Попробуйте следующее:.

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

интерфейсы не нужны никакие функции тела вообще я подозреваю, что они могут видеть только компилятором и даже не ветер в вашем коде вообще

.

Или, потому что вы используете goog.scope вы можете написать:

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

Вы правы, похоже, это работает, как для компилятора, так и для linter. Мне нравится, что он позволяет мне вырезать пространство имен (при использовании в сочетании с 'goog.scope'), но мне нравится, как оригинал делает более понятным, что' bar' - это метод, а не свойство. Я полагаю, что это случай, когда вы не можете получить торт и съесть его :-) – mgilson

+0

Документация для метода в интерфейсе будет иметь такие вещи, как '@ param' и' @ return'. Я даже не знаю, как указать свойство в интерфейсе, я думаю, что у меня были только методы. Есть несколько других тегов, таких как '@dict, @enum, @record, @ struct', которые могут быть вам нужны вместо' @ interface'. См. Https://developers.google.com/closure/compiler/docs/js-for-compiler#tags – owler

+0

документация, которую вы указываете: «Любой класс, который реализует интерфейс, должен реализовать все методы и свойства, определенные на прототипе интерфейса », поэтому я думаю, что это возможно. Я также знаю аннотации, которые вы упомянули, но они не удовлетворяют моему делу. У нас есть угловое приложение и служат шаблоном для модального. Этот модал используется в разных местах, но, к сожалению, было довольно сложно разделить контроллеры, поэтому я хотел удостовериться, что все контроллеры реализовали методы и свойства, которые требует модальный (следовательно, интерфейс). – mgilson

0

Вы можете попробовать @abstract тег, это может помочь. Если нет, закрывающее устройство может suppress предупреждений. Я думаю, что что-то вроде этого будет работать.

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

Удачи вам!

+0

К сожалению, это, похоже, не работает. Закрытие уже знает, что недостающее возвращение в порядке, и закрытие-линтер, похоже, не задумывается о намерении '@ suppress'. – mgilson

2

Оказывается, что ответ был просто ждет, чтобы быть обнаруженным в закрывающем-пухе source code/test cases:

Они пишут что-то вроде:

/** 
* 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() {}; 

укупорочное-ЛИНТЕР теперь достаточно умен, чтобы понять, что Foo является частью интерфейса и не требует какого-либо осуществления в методах. Потрясающе.

Смежные вопросы