有没有办法在Google Closure Compiler中使用枚举作为类型?

时间:2013-08-12 11:53:52

标签: javascript google-closure-compiler

我尝试过像@param {window.MyNamespace.MyEnum} myVar这样的事情,但是编译器抱怨JSC_TYPE_PARSE_ERROR: Bad type annotation. Unknown type window.MyNamespace.MyEnum

如果我的枚举是@typedef,我应该在枚举上做@param {number},还是只使用@enum {number}?我真的更喜欢枚举,因为其他值并不是真正允许的。

(function (MyNamespace) {
  /**
   * @enum {number}
   */
  MyNamespace.MyEnum = {
    FOO: 1,
    BAR: 2,
    BAZ: 3
  }
  /**
   * @constructor
   * @param {Object} foo
   */
  MyNamespace.MyClass = function (foo) {
    this.foo = foo
  }
  /**
   * @constructor
   * @param {MyNamespace.MyClass} bar
   */
  MyNamespace.MyOtherClass = function (bar) {
    this.bar = bar
  }
  /**
   * @param {MyNamespace.MyEnum} baz
   */
  MyNamespace.MyOtherClass.prototype.someMethod = function (baz) {
  }
})(window.MyNamespace = window.MyNamespace || {})

1 个答案:

答案 0 :(得分:4)

Closure-compiler不支持使用函数参数的别名类型。编译后使用--output_wrapper标志封装代码。以下代码正确编译:

/** @const */
var MyNamespace = window.MyNamespace || {};

/** @enum {number} */
MyNamespace.MyEnum = {
  FOO: 1,
  BAR: 2,
  BAZ: 3
};
/**
 * @constructor
 * @param {Object} foo
 */
MyNamespace.MyClass = function (foo) {
  this.foo = foo
};
/**
 * @constructor
 * @param {MyNamespace.MyClass} bar
 */
MyNamespace.MyOtherClass = function (bar) {
  this.bar = bar
};
/** @param {MyNamespace.MyEnum} baz */
MyNamespace.MyOtherClass.prototype.someMethod = function (baz) {};