google 用于传递枚举的闭包编译器注释

google closure compiler annotations for passing enums

我似乎找不到正确的闭包编译器注释来传递枚举映射。

例如:给定 EventTargets AB 和:

/** @enum {string} */
MYNS.A.EventType = {EA : 'ea1'};

/** @enum {string} */
MYNS.B.EventType = {EB : 'eb2'};

我有一个构造函数 C returns 多个事件类型:

/** @return {WHATSTHIS} */
C.prototype.getEventTypesAB = function() {
  return {
    A: MYNS.A.EventType,
    B: MYNS.B.EventType
  };
};

以后用到:

goog.events.listen(parent, c.getEventTypesAB().A.EA, ...);

我已经尝试了一些方法,例如下面的方法,我想这不起作用,因为 enum 不是 type,但我不知道如何注释它:

/** @typedef {{ A: MYNS.A.EventType, B: ... }} */

我总是以(预期的)编译器警告结束:WARNING - Property EA never defined on String 在客户端。

此代码使用 online Closure Compiler Service:

编译
goog.provide("MYNS.A.EventType");
goog.provide("MYNS.B.EventType");
goog.provide("MYNS.C.ComboType");
goog.provide("MYNS.C");
/** @enum {string} */
MYNS.A.EventType = {EA : 'ea1'};
/** @enum {string} */
MYNS.B.EventType = {EB : 'eb2'};
/** @typedef {{ A: MYNS.A.EventType, B: MYNS.B.EventType }} */
MYNS.C.ComboType;
MYNS.C = function() {};
/** @return {!MYNS.C.ComboType} */
C.prototype.getEventTypesAB = function() {
  return {
    A: MYNS.A.EventType,
    B: MYNS.B.EventType
  };
};
var foo = new C();
var r = foo.getEventTypesAB();
console.log(r.A.EA);
console.log(r.B.EB);

我还没有尝试 运行 生成的简单编译代码,但它似乎应该可以工作。以下是编译器通过简单编译和漂亮打印给出的内容:

var MYNS = {A:{}, B:{}};
MYNS.A.EventType = {EA:"ea1"};
MYNS.B.EventType = {EB:"eb2"};
MYNS.C = function() {
};
C.prototype.getEventTypesAB = function() {
  return {A:MYNS.A.EventType, B:MYNS.B.EventType};
};
var foo = new C, r = foo.getEventTypesAB();
console.log(r.A.EA);
console.log(r.B.EB);

我认为您缺少的步骤是使用命名空间名称定义类型,如下所示:

/** @typedef {{ A: MYNS.A.EventType, B: MYNS.B.EventType }} */
MYNS.C.ComboType;

这就是这个页面上显示的内容,我认为这是关于 Google 闭包语法最有帮助的页面:

https://developers.google.com/closure/compiler/docs/js-for-compiler#tags

MYNS.A.EventType 是一个对象,其键是字符串,其值是该枚举的成员。所以你可以写

/** @type {!Object<string, MYNS.A.EventType>} */ var obj = MYNS.A.EventType

它会进行类型检查。对于 B 也是如此。所以您返回的对象文字的类型是记录类型,{A: !Object<string, MYNS.A.EventType>, B: !Object<string, MYNS.B.EventType>}