0

上記の警告が表示され続けますが、理由がわかりません。deps.js を追加しました。deps.js には型への参照が含まれています。

問題のあるコードは次のとおりです。

goog.provide("MyCompany.MyApp.dom");


MyCompany.MyApp.dom.getArticleAmountInput_=function(){
    return document.getElementById("articleAmount");
};
/**
 * Gets the article amount input value
 * @type {function(this:MyCompany.MyApp.dom):number} */
MyCompany.MyApp.dom.getArticleAmount=function(){
    var tmp=this.getArticleAmountInput_();
    return (tmp)?tmp.value():undefined;
};

deps.js で:

goog.addDependency('../../MyCompany/MyApp/dom.js', [ 'MyCompany.MyApp.dom'], []);

コードは html で読み込まれるため、実行時にクラスが検出されます。コードをコンパイルする方法は次のとおりです。

java -jar ../../compiler.jar \
--compilation_level=ADVANCED_OPTIMIZATIONS \
--formatting=PRETTY_PRINT \
--warning_level=VERBOSE \
--summary_detail_level=3 \
--js=MyCompany/MyApp/dom.js \
--js=closure/goog/deps.js \
--js_output_file=out.js

そして、それは私に警告を出し続けます:

警告 - 型注釈が正しくありません。不明なタイプ MyCompany.MyApp.dom

[アップデート]

goog.provide完全に除外し、js=closure/goog/deps.jswhen コンパイルを除外して、すべてを小文字に変更しようとしましたが、このコードで同じ警告が表示され続けます:

//goog.provide("mycompany.myapp.dom");
var mycompany={};
mycompany.myapp={};
mycompany.myapp.dom={};

mycompany.myapp.dom.getArticleAmountInput_=function(){
    return document.getElementById("articleAmount");
};
/**
 * Gets the article amount input value
 * @type {function(this:mycompany.myapp.dom):number} */
mycompany.myapp.dom.getArticleAmount=function(){
    var tmp=this.getArticleAmountInput_();
    return (tmp)?tmp.value():undefined;
};

[アップデート]

問題は、typedef を追加すると警告が表示されることですmyapp.dom is never definedが、コードに型を決定させると、Bad type annotation.

次のようにtypedefを追加しようとしました:

/**
 * @typedef {{getArticleAmount:function(this:myapp.dom):?number}}
 */
myapp.dom;

しかしgoog.provide、myapp.dom を作成する必要があり、コンパイラがそれを認識している必要がある理由はよくわかりません。

[アップデート]

コンストラクターから次の myapp.workflow を作成しました。これで、コンパイラーは型を認識し、Eclipse はコード支援を行うことができます。これが正しい方法かどうかはわかりませんが、小さなプロジェクトをリファクタリングしてみます。

types.js で主な型を設定する

// source: js/mmyapp/types.js
goog.provide("myapp.types");
/** @constructor */
var gooblediegoog=function(){};
/** @constructor */
gooblediegoog.prototype.WorkFlow=function(){};
/** @constructor */
gooblediegoog.prototype.Dom=function(){};
myapp.types=new gooblediegoog();

私のコードではまったく使用されていないが、Eclipse にオートコンプリートの方法を指示するファイル:

// source: js/myapp/forCodeAssist.js
/** @const {boolean} */
var ALLWAYSFALSE=false;

if(ALLWAYSFALSE){
    /**needed for Eclipse autocomplete
     * @constructor
     */
    var MyApp=function(){};
    MyApp.prototype.types=new gooblediegoog();
    Window.prototype.myapp=new MyApp();
    MyApp.prototype.workflow=new myapp.types.WorkFlow();
    MyApp.prototype.dom=new myapp.types.Dom();
}

ワークフローの実装:

// source: js/myapp/workflow.js
goog.provide("myapp.workflow");
goog.require("myapp.types");
goog.require("myapp.dom");

/** @returns number|undefined */
myapp.types.WorkFlow.prototype.createOrder=function(){
    return myapp.dom.getArticleAmout();
};
myapp.workflow=new myapp.types.WorkFlow();
window['console'].log(myapp.workflow.createOrder());

myapp.workflow.createOrder=...これは、で置き換え、 を削除して削除することにより、構文myapp.types.WorkFlow.prototypemyapp.workflow変換myapp.workflow=new myapp.types.WorkFlow()できますgoog.require("myapp.types")。必要に応じて、ビルド/コンパイル プロセスでこれを自動化できます。

goog.requireコンストラクター関数の助けを借りて単一のオブジェクトを作成することは、myapp.workflowを作成してそれにプロパティを追加するよりもはるかにコストがかかるかどうかはわかりません。

4

1 に答える 1

1

匿名型 (名前空間またはシングルトン) は、Closure-compiler に特定の型がなく、注釈で型名として使用できません。新しい型名として使用できるのは、コンストラクターとインターフェイスのみです。(typedef を使用できますが、実際には省略形の注釈にすぎません)

多くの場合、コンパイラは型を正しく推測するので、注釈を付ける必要はありません。あなたの特定のケースでは、問題はthisキーワードの使用にあるようです。this静的オブジェクト/名前空間でキーワードを使用することは危険であり、サポートされていません。コンパイラは警告を発します。注釈を使用して警告を抑制することはできますが、またはを使用して参照を@this具体的に指定していないため、ここでは正しいアクションではありません。this.call.apply

解決策は、完全なオブジェクト名を使用することです。

/**
 * Gets the article amount input value
 */
mycompany.myapp.dom.getArticleAmount=function(){
  var tmp=mycompany.myapp.dom.getArticleAmountInput_();
  return (tmp)?tmp.value():undefined;
};

技術的な詳細については、This this is your this post を参照してください。

于 2013-06-14T13:22:42.737 に答える