Есть ли какой-либо способ обеспечить наследование между перечислениями?

#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.