web-dev-qa-db-fra.com

TypeScript: extension de l'énumération importée

Je peux fusionner des déclarations enum dans un seul fichier, par exemple.

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

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

Cela fonctionne bien, mais mon intention est d’avoir un enum partagé que je pourrai étendre plus tard, par exemple.

// 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'
}

Ce que je reçois c'est

Les déclarations individuelles dans la déclaration fusionnée 'Test' doivent être toutes exportés ou tous locaux.

Existe-t-il un moyen d'obtenir le comportement souhaité?

8
smnbbrv

En vous référant à https://github.com/Microsoft/TypeScript/pull/6213 vous pouvez faire:

// 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'
  }
}

...La magie! ;)

12
Chklang

J'ai vu un moyen que vous pouvez ajouter une fonction/méthode supplémentaire dans une énumération existante. c'est en créant la fonction dans un espace de noms similaire au type enum: 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

Vous pouvez voir les informations complètes ici https://basarat.gitbooks.io/TypeScript/docs/enums.html at section "Enum avec des fonctions statiques"

3
VJPPaz

Après quelques recherches, je dois admettre que je ne peux pas trouver un moyen vraiment approprié de le faire.

Mais il y a deux solutions possibles qui ne sont pas si mauvaises et qui ne pèsent pas autant.

La première consiste à implémenter une énumération personnalisée - cette façon ne permet pas de consommer des énumérations déjà existantes. C'est probablement la seule limitation de cette méthode. Autre que cela, il semble simple et assez natif.

Une autre façon de procéder consiste à lancer un grand piratage avec la fusion de plusieurs énumérations en une valeur avec une déclaration de type séparée. Cela permet de consommer des existants, real enums; toutefois, son utilisation est moins confortable car il existe deux entités à connaître: valeur enum et type enum.

1
smnbbrv