【问题标题】:Is there any way to have inheritance between Enums?有没有办法在枚举之间进行继承?
【发布时间】:2019-03-29 12:36:04
【问题描述】:

我想在我定义的一些枚举之间进行继承。

假设我有以下代码:


/**
 * @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';
    }
};

目前我只是找不到在我的枚举之间进行继承的方法 AND 仍然让它们表现得像枚举(我可以用泛型,但是......糟糕...... +我会从编译器中损失很多汁液。

有没有办法在我的枚举之间进行继承或以某种方式解决枚举特异性和扩展的概念问题?

【问题讨论】:

  • 你的意思是像Object.assign(MyChildEnum, MyBaseEnum)
  • 是的,有点。基本上编译器会吃的任何东西。对于 Object.assign 方法,我仍然遇到编译器错误(使用 gcc 高级)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:

标签: javascript google-closure-compiler google-closure


【解决方案1】:

我假设,使用Google Closure Compiler 我们不能在枚举之间进行继承。

我假设的基础是,Java 不允许枚举继承另一个枚举(尽管使用接口存在一些讨厌的空间),Google Closure Compiler 似乎深受 Java 的启发。

【讨论】:

    猜你喜欢
    • 2011-01-07
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 2015-03-17
    • 2010-10-19
    相关资源
    最近更新 更多