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:
const enum FieldNames {
FirstField: "Field One",
SecondField: "Field Two"
};
someFieldArray[FieldNames.FirstField].label = FieldNames.FirstField;
someFieldArray[FieldNames.SecondField].label = FieldNames.SecondField;
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.
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 ).
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';
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";
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.