0

私はクロージャコンパイラを使用しています。私はアサートする2つのクラスに最低限のメソッド/プロパティセットがあります。これを実現するために、私はインターフェイスを作成しました...例えば:インターフェイスに関するクロージャリンターの警告

goog.scope(function() { 



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


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

}); // goog.scope 

問題はFoo.prototype.barreturn文を持っていないということですので、クロージャリンターは閉鎖自体は完全に満足しているにもかかわらず、文句を言います。もちろん

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注釈を削除すると、その後、閉鎖は不幸であるとメソッドをオーバーライドし、インターフェイスと互換性のない何かを返すことについての警告をスローします。私はこの警告を無効にしたくないのです。なぜなら、最初にインターフェイスを記述した理由は、すべての実装者が必要な作業を行っていることを確認するためです。

このファイルのクロージャーリンターで警告を無効にするために使用できる呪文はありますか?

+1

リンターとコンパイラが一致しないことを少し奇妙かもしれませんが、主な質問は次のようになります。なぜあなたは、文字列を返すために持っているメソッドを実装しましたしかし、しないのですか? – Bergi

+0

@Bergi - それはどんなインターフェースが使われているのですか?実際に、あなたが何かをインターフェースに入れようとすると、クロージャーがあなたに叫ぶでしょう。基本的には、インタフェース(または型チェックの量が異なるレコード)は、さまざまなメソッドに渡すことができるオブジェクトを記述しますが、インタフェースを満たす具体的な実装を作成するのはプログラマの責任です。 – mgilson

+0

ええ、確かに。私はちょうどクロージャコンパイラで十分に精通していないと思う、このイ​​ンターフェイス*の宣言は、私の実装にあまりにも似ています...(そしておそらくリンターにも)。 – Bergi

答えて

1

次のことを試してみてください。

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

インターフェースは、私は、彼らが唯一のコンパイラに表示され、さらには全くあなたのコード内で巻き上げるていない疑いがまったく機能本体を必要としない

それとも、あなたが書くことができgoog.scopeを使用しているので:

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

これはコンパイラとリンターの両方でうまくいくようです。私は名前空間( '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

残念ながら、これはうまくいかないようです。クロージャーは、欠落したリターンがOKであることをすでに知っていて、クロージャー・リンターは '@ suppress'の意図でピックアップしていないようです。 – mgilson

2

それは答えがちょうど閉鎖-リンターsource code/test casesで発見されるのを待ったことが判明:

彼らが何か書く:どうやら彼らのテストケースに細かいlints

/** 
* 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は、インタフェースの一部であり、それは方法のいずれかの実装を必要としないことを把握するのに十分なスマートです。恐ろしい。