TypeScript:扩展导入的枚举

TypeScript:扩展导入的枚举,typescript,enums,Typescript,Enums,我可以在单个文件中合并枚举声明,例如 export enum Test { value1 = <any>'value1', value2 = <any>'value2' } export enum Test { value3 = <any>'value3' } 导出枚举测试{ value1='value1', value2='value2' } 导出枚举测试{ value3='value3' } 这很好,但我的目的是拥有一个共享枚举,我可以在

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

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

export enum Test {
  value3 = <any>'value3'
}
导出枚举测试{
value1='value1',
value2='value2'
}
导出枚举测试{
value3='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.enum.ts
导出枚举测试{
value1='value1',
value2='value2'
}
//place-to-extend-enum.ts
从“./Test.enum”导入{Test};
导出枚举测试{
value3='value3'
}
我得到的是

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


有什么方法可以达到想要的行为吗?

经过一些研究后,我必须承认,我找不到一个超级合适的方法来做到这一点

但有两种可能的解决方案没有那么糟糕,也没有那么臭

首先是实现自定义枚举-这种方式不允许使用现有的枚举。这可能是该方法的唯一限制。除此之外,它看起来很简单,很土生土长

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

在参考中,您可以做:

// 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'
  }
}
//test.enum.ts
导出枚举测试{
value1='value1',
value2='value2'
}
//place-to-extend-enum.ts
从“./Test.enum”导入{Test};
声明模块'./test.enum'{
导出枚举测试{
value3='value3'
}
}
。。。
Magic!;)

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

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

您可以在“带有静态函数的枚举”部分查看完整信息。

这给了我
错误:(25,14)TS1066:在环境枚举声明中,成员初始值设定项必须是常量表达式。
,所以它实际上不适用于字符串。但我必须承认,如果我不分配
value3
,它确实有效。+1虽然它适用于typescript 2.4,它支持本机枚举为stringok,设法使它工作,但它只在v2.4版上工作,而且仍然无法创建创建一个新的枚举。但是,它改变了现有的枚举,因此换句话说,仍然不可能有另一个枚举…除此之外,答案对我来说很好。谢谢!这似乎实际不起作用。它扩展了枚举的接口,因此
value3
被认为是有效的编译时值,但实际的运行时值是st没有定义。