4

我尝试做类似的事情@param {window.MyNamespace.MyEnum} myVar,但编译器抱怨了JSC_TYPE_PARSE_ERROR: Bad type annotation. Unknown type window.MyNamespace.MyEnum.

如果我的枚举是,我应该在枚举上做一个@typedef,还是只使用?我真的更喜欢 enum 的东西,因为其他值是不允许的。@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 || {})
4

1 回答 1

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) {};
于 2013-08-12T16:47:52.120 回答