web-dev-qa-db-fra.com

Quelle est la différence entre l'énumération et l'objet en tapuscrit

J'essaie d'accéder aux valeurs d'une carte via enum et de créer également une application prête pour la traduction pour toutes les chaînes qu'elle contient. Les deux préoccupations se chevauchent et je dois choisir entre utiliser des énumérations ou simplement un objet au format JSON.

Alors, quelle est exactement la différence et l'utilisation entre une énumération et un objet?

Par exemple:

  • Je peux utiliser des énumérations pour accéder aux tableaux ainsi que pour insérer des étiquettes et d'autres choses comme
const enum FieldNames {
  FirstField: "Field One",
  SecondField: "Field Two"
};
    
someFieldArray[FieldNames.FirstField].label = FieldNames.FirstField;
someFieldArray[FieldNames.SecondField].label = FieldNames.SecondField;
  • Ou je peux obtenir le même comportement via un objet
const FieldNames = {
  FirstField: "Field One",
  SecondField: "Field Two"
};

someFieldArray[FieldNames.FirstField].label = FieldNames.FirstField;
someFieldArray[FieldNames.SecondField].label = FieldNames.SecondField;

Je n'ai vraiment pas l'avantage de choisir des énumérations plutôt que des objets simples. À mon avis, un objet a beaucoup plus d'avantages sans aucun inconvénient.

19
Florian Leitgeb

Enum

Une énumération peut vous offrir des avantages supplémentaires, si vous voulez les fonctionnalités:

const enum FieldNamesEnum {
  FirstField = "Field One",
  SecondField = "Field Two"
};

let x: FieldNamesEnum;

x = FieldNamesEnum.FirstField;
x = FieldNamesEnum.SecondField;

// Error - not assignable to FieldNames
x = 'str';

// Cannot assign
FieldNamesEnum.FirstField = 'str';

Surtout, vous ne pouvez pas attribuer aux membres de l'énumération et les types sont vérifiés aux membres de l'énumération, plutôt qu'à la chaîne.

De plus, comme vous avez utilisé un const enum dans votre exemple, l'énumération n'existera pas au moment de l'exécution et toutes les références seront substituées aux valeurs littérales (si vous avez utilisé un simple enum l'énumération existerait existait au moment de l'exécution ).

Objet

Comparez cela à l'exemple d'objet:

const FieldNames = {
  FirstField: "Field One",
  SecondField: "Field Two"
};

let y: string;

y = FieldNames.FirstField;
y = FieldNames.SecondField;

// Oops it works
y = 'str';

// Oops it works

FieldNames.FirstField = 'str';

Syndicat

Si vous n'avez pas besoin de l'énumération complète, mais souhaitez limiter les valeurs, vous pouvez utiliser une union de valeurs littérales:

type FieldNames = "Field One" | "Field Two";

let x: FieldNames;

x = "Field One";
x = "Field Two";

// Error - not allowed
x = "Field Three";
20
Fenton
function (foo: FieldNames) { }

Si FieldNames est un objet, cela signifie que cette fonction attend une instance qui a les propriétés FirstField et SecondField. Si FieldNames est une énumération (auquel cas elle doit être singulière et non plurielle), cela signifie que la fonction attend ne des valeurs de FieldNames, à savoir "Field One" ou "Field Two".

Utilisation très différente.

6
deceze