0

Я не могу найти правильные аннотации закрытия-компилятора, чтобы передать карту перечислений.аннотации компилятора google закрытия для передачи перечислений

Например: Учитывая EventTargets A, B с:

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

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

У меня есть конструктор C, который возвращает несколько EventTypes:

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

будет использоваться позже:

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

I Я пробовал несколько вещей, таких как ниже, которые я думаю, не работает, как enum не type, но я из идей о том, как аннотировать это:

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

Я всегда в конечном итоге с (ожидается) предупреждение компилятора: WARNING - Property EA never defined on String на клиенте.

ответ

3

MYNS.A.EventType - объект, ключи которого являются строками и значения которых являются членами этого перечисления. Таким образом, вы могли бы написать

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

и было бы typecheck. Аналогично для B. Таким образом, тип возвращаемого объекта - это тип записи, {A: !Object<string, MYNS.A.EventType>, B: !Object<string, MYNS.B.EventType>}

+0

yep, разница между экземпляром типа и типом объекта, определяющим тип, иногда путается. – John

-1

Этот код компилируется с 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

 Смежные вопросы

  • Нет связанных вопросов^_^