[更新]
基本上带有 JSDT 的 Eclipse 无法完成这项工作。试图用构造函数定义我所有的命名空间,但这太麻烦了。
现在尝试使用 netbeans,它将帮助大多数闭包库和我的所有代码。goog.array 之类的某些事情不会完成,因为 goog.array 从未定义过。将 goog.array=new Object() 添加到 array.js 时,它将完成 goog.array 和 goog.array.ArrayLike。这些修改后的 js 文件位于项目的 js/libs 目录中。
如果你想用麻烦的方法让它在 Eclipse 中工作,那么请继续阅读。
Eclipse 似乎在声明为对象文字的对象方面存在问题。用构造函数声明我的复杂类型似乎可以解决问题。Window
必须在(大写 W)上创建根对象的实例。
// this would be the way I would define
// a complex property that doesn't need
// more than one instance and is not complex
// enough to put in a separate file
myapp.workflow.objectLiteral={
thisDoesNotCodeAssist:function(){},
neitherDoesThis:22
};
/** if you define the complex property as
* a constructor it will auto complete
* in other files and closure compiler will
* recognize it's type
*/
/** @constructor organizes flow
* used for Eclipse code assist */
var WorkFlow=function(){};
ProwpWithSubs=function(){};
PropWithSubs.prototype.subProp=22;
PropWithSubs.prototype.subFunction=function(){
this.subsub=44;
};
WorkFlow.prototype.propwithsubs=new PropWithSubs();
if(ALLWAYSFALSE){
/**needed for Eclipse code assist
* @constructor
*/
var MyApp=function(){};
MyApp.prototype.workflow=new WorkFlow();
MyApp.prototype.dom=new DOM();
Window.prototype.myapp=new MyApp();
}else{
myapp.workflow=new WorkFlow();
}
[更新]
这是我用来拆分定义和实现的 3 个文件,因此使用 google 关闭更容易。
在 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 并向其添加属性(以及在闭包库中所做的那样)要昂贵得多。