TypeScript:扩展导入的枚举

smn*_*brv 11 enums typescript

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

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

export enum Test {
  value3 = <any>'value3'
}
Run Code Online (Sandbox Code Playgroud)

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

// 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'
}
Run Code Online (Sandbox Code Playgroud)

我得到的是

合并声明'Test'中的个别声明必须全部导出或全部导出.

有没有办法实现理想的行为?

Chk*_*ang 13

请参阅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'
  }
}
Run Code Online (Sandbox Code Playgroud)

... 魔法!;)

  • 这似乎实际上不起作用。它扩展了枚举的接口,以便“value3”被视为有效的编译时值,但实际的运行时值仍然未定义。 (5认同)

VJP*_*Paz 7

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

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
Run Code Online (Sandbox Code Playgroud)

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