Enumを使用してマップの値にアクセスし、その中のすべての文字列の翻訳対応アプリを作成しようとしています。両方の懸念が重複しているため、列挙型を使用するか、JSON形式のオブジェクトのみを使用するかを決定する必要があります。
では、列挙型とオブジェクトの違いと使用法は正確に何ですか?
例えば:
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;
単純なオブジェクトよりも列挙型を選択するメリットは得られません。私の意見では、オブジェクトにはマイナス面のないはるかに多くの利点があります。
機能が必要な場合は、列挙型を使用すると追加の利点が得られます。
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';
重要なのは、列挙型メンバーに割り当てることができず、型が文字列ではなく列挙型メンバーにチェックされることです。
さらに、const enum
の例では、列挙型は実行時に存在せず、すべての参照がリテラル値に置き換えられます(プレーンenum
を使用した場合、列挙型would実行時に存在します) )。
これをオブジェクトの例と比較してください。
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';
完全な列挙型は必要ないが、値を制限したい場合は、リテラル値の結合を使用できます。
type FieldNames = "Field One" | "Field Two";
let x: FieldNames;
x = "Field One";
x = "Field Two";
// Error - not allowed
x = "Field Three";
function (foo: FieldNames) { }
FieldNames
がオブジェクトの場合、この関数はプロパティFirstField
およびSecondField
を持つインスタンスを期待することを意味します。 FieldNames
が列挙型の場合(この場合、複数ではなく単数である必要があります)、これは、関数がFieldNames
の値の1つ、つまり"Field One"
または"Field Two"
。
非常に異なる使用法。