上記の警告が表示され続けますが、理由がわかりません。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.js
when コンパイルを除外して、すべてを小文字に変更しようとしましたが、このコードで同じ警告が表示され続けます:
//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.prototype
にmyapp.workflow
変換myapp.workflow=new myapp.types.WorkFlow()
できますgoog.require("myapp.types")
。必要に応じて、ビルド/コンパイル プロセスでこれを自動化できます。
goog.require
コンストラクター関数の助けを借りて単一のオブジェクトを作成することは、myapp.workflowを作成してそれにプロパティを追加するよりもはるかにコストがかかるかどうかはわかりません。