web-dev-qa-db-ja.com

タイプスクリプトの列挙型とオブジェクトの違いは何ですか

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;

単純なオブジェクトよりも列挙型を選択するメリットは得られません。私の意見では、オブジェクトにはマイナス面のないはるかに多くの利点があります。

19
Florian Leitgeb

列挙型

機能が必要な場合は、列挙型を使用すると追加の利点が得られます。

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";
20
Fenton
function (foo: FieldNames) { }

FieldNamesがオブジェクトの場合、この関数はプロパティFirstFieldおよびSecondFieldを持つインスタンスを期待することを意味します。 FieldNamesが列挙型の場合(この場合、複数ではなく単数である必要があります)、これは、関数がFieldNamesの値の1つ、つまり"Field One"または"Field Two"

非常に異なる使用法。

6
deceze