Я получаю много предупреждений "Unknown type"
при запуске довольно большой библиотеки через Closure Compiler, и они, похоже, возникают, когда мои типы объявляются в самоисполняющихся анонимных функциях. В этом нет ничего экзотичного, но если я отключу самоисполняемые функции, объявления типа будут работать (по крайней мере, в этом простом тесте).
Я не уверен, что что-то не так с моими аннотациями кода или если в коде есть что-то незаконное, но я думаю, что это все кошерный и стандартный способ модулизации API.
Следующий тестовый код создает пространство имен (просто простой старый объект JS) и присоединяет перечисление (литерал объекта) и функцию к нему.
var mynamespace = {};
(function (mynamespace) {
/**
* Some enum.
* @enum {number}
*/
mynamespace.SomeEnum = {
FOO: 1,
BAR: 2
};
/**
* Frazzle some type.
* @param {mynamespace.SomeEnum} qux The type to frazzle.
* @return {boolean} whether the operation succeeded.
*/
mynamespace.frazzle = function(qux) {
return true;
}
}(mynamespace));
// call it
mynamespace.frazzle(mynamespace.SomeEnum.FOO);
Выглядит хорошо, не так ли? Ошибки компилятора замыкания:
[jscomp] Compiling 1 file(s) with 37 extern(s)
[jscomp] X:\dev\solclientjs\sdk\tools\jscomptest.js:14: WARNING - Parse error. Unknown type mynamespace.SomeEnum
[jscomp] * @param {mynamespace.SomeEnum} qux The type to frazzle.