Я продолжаю получать предупреждение, упомянутое выше, но не могу понять, почему. Я добавил 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
при компиляции и изменил все на нижний регистр, но продолжает получать одно и то же предупреждение об этом коде:
//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 и добавление к нему свойств, как я делал раньше (и как это делается в библиотеке закрытия).
goog.array.something=something
. Ни одно из свойств goog.array не добавляется с помощью goog.array.prototype. Я думал, что вы используете прототип для подкласса или когда ожидаете, что будет больше экземпляров (например, функция конструктора). - person HMR   schedule 14.06.2013goog.array
в качестве переменной функции, у которой было@param {goog.array} ga goog.array
, и получил такое же предупреждениеbad type annotation
. Пытался сообщить компилятору, что такоеthis
, потому что он продолжает ныть оdangerous use of this in static method
В книге, которую я читал, решение заключалось в том, чтобы установить аннотацию @this. Я думаю, что пока просто откажусь от этого, так как это кажется слишком сложным. - person HMR   schedule 14.06.2013goog.array
является литералом объекта. У него есть такие свойства, какindexof
иlastIndexOf
. Литералы объектов не имеют типа, поэтому вы не можете сказать, чтоthis
контекст его функций равенgoog.array
, поэтому, когда я буду реализовывать indexof, я должен каждый раз записыватьgoog.array.someProp
вместоthis.someProp
, иначе компилятор жаловаться на контекстthis
. Раньше я вводил полное пространство имен, но мне просто было интересно, почему я не могу использоватьthis
в своих функциях, но думаю, что теперь понимаю. - person HMR   schedule 15.06.2013