TypeScript で Enum の順序値を取得する方法を徹底解説! 7つの方法を比較
TypeScript で Enum の順序値を取得する方法
方法 1: 直接アクセス
最も簡単な方法は、列挙型のメンバー名に直接アクセスすることです。例えば、以下のコードは NubDirection
列挙型の OUTWARD
メンバーの順序値 (0) を取得します。
enum NubDirection {
OUTWARD,
INWARD
}
const direction: NubDirection = NubDirection.OUTWARD;
const ordinal = direction; // ordinal は 0 になります
方法 2: valueOf()
メソッドを使用する
列挙型メンバーには valueOf()
メソッドが定義されており、その順序値を返すことができます。
enum NubDirection {
OUTWARD,
INWARD
}
const direction: NubDirection = NubDirection.OUTWARD;
const ordinal = direction.valueOf(); // ordinal は 0 になります
方法 3: Object.keys()
と Object.values()
を使用する
Object.keys()
と Object.values()
を使って、列挙型のメンバー名と順序値の配列を取得することができます。
enum NubDirection {
OUTWARD,
INWARD
}
const memberNames = Object.keys(NubDirection); // memberNames は ["OUTWARD", "INWARD"] になります
const ordinals = Object.values(NubDirection); // ordinals は [0, 1] になります
方法 4: for...in ループを使用する
for...in
ループを使って、列挙型のメンバー名を反復処理し、順序値を取得することができます。
enum NubDirection {
OUTWARD,
INWARD
}
for (const memberName in NubDirection) {
const ordinal = NubDirection[memberName];
console.log(`${memberName}: ${ordinal}`); // OUTWARD: 0, INWARD: 1 と出力されます
}
- 列挙型のメンバーに数値リテラルを割り当てることで、順序値を明示的に指定することができます。
- 列挙型の順序値は、0 から始まる連続した整数であることを保証する必要があります。
enum NubDirection {
OUTWARD = 0,
INWARD = 1
}
- TypeScript バージョン 3.8 以降では、
enum
キーワードにconst
またはreadonly
を付与して、列挙型のメンバーを定数として宣言することができます。
enum NubDirection {
OUTWARD = 0,
INWARD = 1
}
enum NubDirection {
OUTWARD,
INWARD
}
const direction: NubDirection = NubDirection.OUTWARD;
const ordinal = direction; // ordinal は 0 になります
console.log(ordinal); // 0 と出力されます
enum NubDirection {
OUTWARD,
INWARD
}
const direction: NubDirection = NubDirection.OUTWARD;
const ordinal = direction.valueOf(); // ordinal は 0 になります
console.log(ordinal); // 0 と出力されます
enum NubDirection {
OUTWARD,
INWARD
}
const memberNames = Object.keys(NubDirection); // memberNames は ["OUTWARD", "INWARD"] になります
const ordinals = Object.values(NubDirection); // ordinals は [0, 1] になります
console.log(memberNames); // ["OUTWARD", "INWARD"] と出力されます
console.log(ordinals); // [0, 1] と出力されます
enum NubDirection {
OUTWARD,
INWARD
}
for (const memberName in NubDirection) {
const ordinal = NubDirection[memberName];
console.log(`${memberName}: ${ordinal}`); // OUTWARD: 0, INWARD: 1 と出力されます
}
例 5: 数値リテラルによる順序値指定
enum NubDirection {
OUTWARD = 0,
INWARD = 1
}
const direction: NubDirection = NubDirection.OUTWARD;
const ordinal = direction; // ordinal は 0 になります
console.log(ordinal); // 0 と出力されます
例 6: const
修飾子による定数宣言
const enum NubDirection {
OUTWARD = 0,
INWARD = 1
}
const direction: NubDirection = NubDirection.OUTWARD;
const ordinal = direction; // ordinal は 0 になります
console.log(ordinal); // 0 と出力されます
enum
型にはコンストラクタが定義されており、順序値を指定して新しい Enum メンバーを作成することができます。
enum NubDirection {
OUTWARD = new NubDirection(0),
INWARD = new NubDirection(1)
}
const direction: NubDirection = NubDirection.OUTWARD;
const ordinal = direction.valueOf(); // ordinal は 0 になります
console.log(ordinal); // 0 と出力されます
方法 6: カスタム Enum クラスを作成する
より柔軟な制御が必要な場合は、カスタム Enum クラスを作成することができます。
class NubDirection {
private readonly ordinal: number;
constructor(ordinal: number) {
this.ordinal = ordinal;
}
get value(): number {
return this.ordinal;
}
}
const outwardDirection = new NubDirection(0);
const inwardDirection = new NubDirection(1);
const ordinal = outwardDirection.value; // ordinal は 0 になります
console.log(ordinal); // 0 と出力されます
方法 7: TypeScript ジェネリックを使用する
TypeScript ジェネリックを使用して、任意の型で Enum を定義することができます。
type NubDirection<T> = {
[K in keyof T]: { ordinal: number; value: T[K] };
};
const nubDirection: NubDirection<{ outward: 0; inward: 1 }> = {
outward: { ordinal: 0, value: 0 },
inward: { ordinal: 1, value: 1 }
};
const ordinal = nubDirection.outward.ordinal; // ordinal は 0 になります
console.log(ordinal); // 0 と出力されます
- 基本的な Enum の順序値取得には、上記の最初の 4 つの方法がおすすめです。
- これらの方法は、より高度なユースケース向けに設計されています。
typescript