TypeScript: расширение импортированного перечисления


Я могу объединить объявления enum в одном файле, например

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" должны быть все экспортированные или все местные.

Есть ли способ добиться желаемого поведения?
3   7   2017-01-30 19:04:32

3 ответа:

В отношении 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'
  }
}

... Магия! ;)

Я видел способ, которым вы можете добавить дополнительную функцию / метод в существующее перечисление. это создать функцию в пространство имен, подобное перечисление: здесь

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 в разделе "перечисление со статическими функциями"

После некоторых исследований я должен признать, что не могу найти супер-правильный способ сделать это.

Но есть два возможных решения, которые не так уж плохи и не так сильно воняют.

Во - первых, это реализация пользовательского перечисления-этот способ не позволяет использовать уже существующие перечисления. Это, пожалуй, единственное ограничение данного метода. В остальном он выглядит простым и вполне родным.

Другой способ-это большой обходной путь с [слиянием перечислений в одно значение с отдельным типом декларация. Этот способ позволяет потреблять уже существующие, реальные перечисления; однако он менее удобен в использовании, потому что есть две сущности, о которых нужно знать: значение перечисления и тип перечисления.