【问题标题】:TypeScript: extending imported enumTypeScript:扩展导入的枚举
【发布时间】:2017-06-15 20:56:28
【问题描述】:

我可以在单个文件中合并枚举声明,例如

export enum Test {
  value1 = <any>'value1',
  value2 = <any>'value2'
}

export enum Test {
  value3 = <any>'value3'
}

这很好用,但我的意图是有一个共享枚举,我可以稍后扩展它,例如

// test.enum.ts
export enum Test {
  value1 = <any>'value1',
  value2 = <any>'value2'
}

// place-to-extend-enum.ts
import { Test } from './test.enum';

export enum Test {
  value3 = <any>'value3'
}

我得到的是

合并声明“Test”中的单个声明必须全部为 导出或全部本地。

有没有办法实现所需的行为?

【问题讨论】:

    标签: typescript enums


    【解决方案1】:

    经过一番研究,我必须承认我找不到一种非常合适的方法来做到这一点。

    但是有两种可能的解决方案,它们并没有那么糟糕,也没有那么臭。

    首先是实现一个自定义枚举——这种方式不允许使用已经存在的枚举。这可能是这种方法的唯一限制。除此之外,它看起来很简单而且非常原生。

    另一种方法是 [将枚举合并到一个具有单独类型声明的值中]。这种方式允许使用已经存在的 real 枚举;但是使用起来不太舒服,因为需要注意两个实体:枚举值和枚举类型。

    【讨论】:

      【解决方案2】:

      参考https://github.com/Microsoft/TypeScript/pull/6213你可以这样做:

      // test.enum.ts
      export enum Test {
        value1 = <any>'value1',
        value2 = <any>'value2'
      }
      
      // place-to-extend-enum.ts
      import { Test } from './test.enum';
      
      declare module './test.enum' {
        export enum Test {
          value3 = <any>'value3'
        }
      }
      

      ... 魔法! ;)

      【讨论】:

      • 这给了我Error:(25, 14) TS1066:In ambient enum declarations member initializer must be constant expression.,所以它不适用于字符串。但我必须承认,如果我不指定value3,它确实有效。 +1 虽然
      • 它适用于 typescript 2.4,它支持原生枚举作为字符串
      • 好的,设法让它工作,只有 v2.4,但它仍然没有创建一个新的枚举。然而,它改变了现有的枚举,所以换句话说,仍然不可能有另一个枚举......除此之外,答案对我来说看起来不错。谢谢!
      • 这似乎不起作用。它扩展了枚举的接口,因此value3 被认为是一个有效的编译时值,但实际的运行时值仍未定义。
      【解决方案3】:

      我看到了一种可以在现有枚举中添加其他函数/方法的方法。这是通过在类似于枚举类型的命名空间内创建函数:这里

      enum Weekday {
          Monday,
          Tuesday,
          Wednesday,
          Thursday,
          Friday,
          Saturday,
          Sunday
      }
      namespace Weekday {
          export function isBusinessDay(day: Weekday) {
              switch (day) {
                  case Weekday.Saturday:
                  case Weekday.Sunday:
                      return false;
                  default:
                      return true;
              }
          }
      }
      
      const mon = Weekday.Monday;
      const sun = Weekday.Sunday;
      console.log(Weekday.isBusinessDay(mon)); // true
      console.log(Weekday.isBusinessDay(sun)); // false
      

      您可以在“带静态函数的枚举”部分的https://basarat.gitbooks.io/typescript/docs/enums.html 处查看完整信息

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-10
        相关资源
        最近更新 更多