2016-03-19 9 views
0

ADVANCED_OPTIMIZATIONSを使用してコンパイルすると、Closure Compilerが奇妙な警告を出力します。クローズコンパイラ - @extendsタグで型を解決できません

私はインターフェイスを使用してこのコードをコンパイル警告がありClosure Compiler UI

でそれを見ることができます - @interface

// ==ClosureCompiler== 
// @output_file_name default.js 
// @compilation_level ADVANCED_OPTIMIZATIONS 
// ==/ClosureCompiler== 

/** 
* @interface 
* @extends {IReused} 
*/ 
function IRegistration() { 
} 

/** 
* @interface 
*/ 
function IInitializable() { 
} 

/** 
* @param {IReused} initializer 
*/ 
IInitializable.prototype.initializedBy = function (initializer) { }; 

/** 
* @interface 
* @extends {IOwned} 
*/ 
function IReused() { 
} 


/** 
* @interface 
*/ 
function IOwned() { 
} 

出力:

WARNING - Could not resolve type in @extends tag of IRegistration 
function IRegistration() { 
^ 
0 error(s), 1 warning(s) 

しかし、私はすべての変更@constructorを使用するクラスへのインタフェースはすべて動作します。

// ==ClosureCompiler== 
// @output_file_name default.js 
// @compilation_level ADVANCED_OPTIMIZATIONS 
// ==/ClosureCompiler== 

/** 
* @constructor 
* @extends {IReused} 
*/ 
function IRegistration() { 
} 

/** 
* @constructor 
*/ 
function IInitializable() { 
} 

/** 
* @param {IReused} initializer 
*/ 
IInitializable.prototype.initializedBy = function (initializer) { }; 

/** 
* @constructor 
* @extends {IOwned} 
*/ 
function IReused() { 
} 


/** 
* @constructor 
*/ 
function IOwned() { 
} 

インターフェースを使用しているとき、私はinitializedBy関数からIReusedパラメータを削除すると、期待どおりまた、すべての作品。

/** 
* @interface 
* @extends {IReused} 
*/ 
function IRegistration() { 
} 
... 


/** 
* @param {IReused} initializer 
*/ 
IInitializable.prototype.initializedBy = function (initializer) { }; 

To -> 

/** 
* @param {*} initializer 
*/ 
IInitializable.prototype.initializedBy = function (initializer) { }; 

誰かが私に間違っていることを説明できますか?

+0

注文:

また、このコードは次のようになります。 –

+0

転送参照が不要なことはどういう意味ですか?あなたは例を挙げることができますか? – Sagi

答えて

1

IRegistrationで使用された後にIReusedIOwnedを定義したことが問題です。

デクラレーションを上に移動するだけで正常に動作します。 コンパイラUI hereで確認してください。前方参照が必要とされていない、あなたの種類

// ==ClosureCompiler== 
// @output_file_name default.js 
// @compilation_level ADVANCED_OPTIMIZATIONS 
// ==/ClosureCompiler== 

/** 
* @interface 
*/ 
function IOwned() { 
} 

/** 
* @interface 
* @extends {IOwned} 
*/ 
function IReused() { 
} 


/** 
* @interface 
* @extends {IReused} 
*/ 
function IRegistration() { 
} 

/** 
* @interface 
*/ 
function IInitializable() { 
} 

/** 
* @param {IReused} initializer 
*/ 
IInitializable.prototype.initializedBy = function (initializer) { }; 
+0

コードの前方宣言を生成し、インタフェースの宣言を上に移動できない場合は、コンパイラに渡すこともできます。 – codebreach

+0

ご意見ありがとうございます。しかし、私はこの問題がなぜ私がクラスではなくインターフェイスを使用するときにのみ現れるのか理解できません。 – Sagi

+0

正直なところ私は理由は分かりませんが、インターフェイスやクラスが実装される方法と関係があると想定しています。インタフェースはクラスよりも静的に、コンパイラの前にはチェックされます。クロージャーコンパイラのGoogleグループまたはgithubリポジトリの専門家は、おそらくもっと情報に基づいた回答を与えることができます。 – codebreach

関連する問題