#javascript #google-closure-compiler #google-closure
#javascript #google-closure-compiler #google-закрытие
Вопрос:
Я хотел бы иметь наследование между некоторыми перечислениями, которые я определяю.
Допустим, у меня есть следующий код:
/**
* @enum {!number}
*/
var MyBaseEnum = {
IS_VALID : 0b00000001,
UNDER_VALIDATION : 0b00000010,
SUBMITTING : 0b00000100
};
/**
* @enum {!number}
* @extends {MyBaseEnum}
*/
var MyChildEnum = {
AN_ODDBALL_STATE : 0b00001000,
ANOTHER_ODDBALL_STATE : 0b00010000
};
goog.inherits(MyChildEnum, MyBaseEnum);
/**
* @param {!MyBaseEnum} myEnum
* @return {!string}
*/
function iExpectBaseEnum (myEnum) {
switch (myEnum) {
case MyBaseEnum.IS_VALID:
return "It's valid, man!";
case MyBaseEnum.UNDER_VALIDATION:
return "Chill, I'm working on it.";
case MyBaseEnum.SUBMITTING:
return "Under submission, bro.";
default:
return 'WAT';
}
};
/**
* @param {!MyChildEnum} myEnum
* @return {!string}
*/
function iExpectChildEnum (myEnum) {
switch (myEnum) {
case MyChildEnum.AN_ODDBALL_STATE:
return 'Dunno.';
case MyChildEnum.ANOTHER_ODDBALL_STATE:
return 'Dunno, bro.';
// Accessing parent's IS_VALID would be nice through MyChildEnum.
case MyChildEnum.IS_VALID:
return "It's valid, man!";
// But also would be nice to have it work with paren'ts value.
case MyBaseEnum.UNDER_VALIDATION:
return "Chill, I'm working on it.";
case MyBaseEnum.SUBMITTING:
return "Under submission, bro.";
default:
return 'WAT';
}
};
На данный момент я просто не могу найти способ обеспечить наследование между моими перечислениями И при этом заставить их вести себя как перечисления (я мог бы сделать ужасно уродливый вонючий взлом для реализации моей собственной системы перечислений с помощью дженериков, но… фу… Я бы потерял много энергии от компилятора.
Есть ли какой-нибудь способ обеспечить наследование между моими перечислениями или как-то решить концептуальную проблему специфичности перечисления и расширения?
Комментарии:
1. Вы имеете в виду, как
Object.assign(MyChildEnum, MyBaseEnum)
2. Да, вроде того. В принципе, все, что может съесть компилятор. Для
Object.assign
подхода я все еще получаю ошибки компилятора (используя gcc advanced)Bad type annotation. type annotation incompatible with other annotations. See https://github.com/google/closure-compiler/wiki/Bad-Type-Annotation for more information.
иelement IS_VALID does not exist on this enum case MyChildEnum.IS_VALID:
Ответ №1:
Я предполагаю, что с помощью компилятора Google Closure мы не можем иметь наследования между перечислениями.
Основа моего предположения заключается в том, что Java не позволяет перечислению наследовать другое (хотя есть место для некоторой пакости с использованием интерфейсов), и компилятор закрытия Google, похоже, сильно вдохновлен Java.