TypeScript で enum を効果的に活用する - クラス内 enum の詳細と代替手段
TypeScript におけるクラス内 enum の定義と詳細解説
定義と構文
クラス内に enum を定義するには、 enum
キーワードと中括弧 ({ }) を使用します。 enum のメンバーは、,
で区切ってカンマ区切りで列挙します。
class Person {
// enum を定義
enum Status {
Active,
Inactive,
Pending
}
// メンバー変数
name: string;
status: Status;
// コンストラクタ
constructor(name: string, status: Status) {
this.name = name;
this.status = status;
}
}
この例では、Person
クラス内に Status
という名前の enum を定義しています。 この enum には、Active
、Inactive
、Pending
の 3 つのメンバーがあります。
メンバーのアクセス
enum のメンバーは、.
演算子を使用してクラス内のインスタンスからアクセスできます。
const person1 = new Person('John Doe', Person.Status.Active);
console.log(person1.status); // Active
const person2 = new Person('Jane Doe', Person.Status.Inactive);
console.log(person2.status); // Inactive
列挙型の利点
- 可読性: enum を使用すると、定数に意味のある名前を付けることができ、コードを読みやすく、理解しやすくなります。
- 保守性: enum を使用すると、関連する定数を一箇所で管理できるため、コードの変更が容易になります。
- 安全性: enum を使用すると、誤った値が割り当てられるのを防ぐことができます。
追加機能
- 数値値の割り当て: enum メンバーに数値値を割り当てることができます。
enum Status {
Active = 1,
Inactive = 2,
Pending = 3
}
- 計算プロパティ: enum メンバーに計算プロパティを定義できます。
enum Status {
Active,
Inactive,
Pending,
get isDisabled() {
return this === Status.Inactive || this === Status.Pending;
}
}
class Person {
// enum を定義
enum Status {
Active,
Inactive,
Pending
}
// メンバー変数
name: string;
status: Status;
// コンストラクタ
constructor(name: string, status: Status) {
this.name = name;
this.status = status;
}
// メソッド
isActive(): boolean {
return this.status === Person.Status.Active;
}
}
// インスタンスの作成と使用
const person1 = new Person('John Doe', Person.Status.Active);
console.log(person1.name); // John Doe
console.log(person1.status); // Active
console.log(person1.isActive()); // true
const person2 = new Person('Jane Doe', Person.Status.Inactive);
console.log(person2.name); // Jane Doe
console.log(person2.status); // Inactive
console.log(person2.isActive()); // false
この例では、以下の点に注目してください。
Status
enum はPerson
クラス内に定義されています。Person
クラスには、name
とstatus
という 2 つのメンバー変数があります。status
変数はStatus
型です。Person
クラスには、isActive
というメソッドがあります。 このメソッドは、status
プロパティがActive
であるかどうかを確認して、boolean
値を返します。- コード例では、
Person
クラスの 2 つのインスタンスを作成し、そのプロパティとメソッドにアクセスしています。
定数
最も単純な方法は、個別の定数を宣言することです。
class Person {
// 定数を宣言
static readonly Active = 'active';
static readonly Inactive = 'inactive';
static readonly Pending = 'pending';
// メンバー変数
name: string;
status: string;
// コンストラクタ
constructor(name: string, status: string) {
this.name = name;
this.status = status;
}
// メソッド
isActive(): boolean {
return this.status === Person.Active;
}
}
この例では、Person
クラス内に Active
、Inactive
、Pending
という 3 つの定数を宣言しています。 これらの定数は、クラス内で static
キーワードを使用して宣言されています。
利点:
- シンプルで分かりやすい
欠点:
- 可読性が低い
- 保守性が低い
- 型安全性がない
文字列リテラル型
TypeScript 4.1 以降では、文字列リテラル型を使用して、定数セットをより安全かつ型安全に定義することができます。
class Person {
// 文字列リテラル型を宣言
type Status = 'active' | 'inactive' | 'pending';
// メンバー変数
name: string;
status: Status;
// コンストラクタ
constructor(name: string, status: Status) {
this.name = name;
this.status = status;
}
// メソッド
isActive(): boolean {
return this.status === 'active';
}
}
この例では、Person
クラス内に Status
という名前の文字列リテラル型を宣言しています。 この型は、'active'
、'inactive'
、'pending'
のいずれかの値を持つことができます。
- enum ほど直感的ではない
サードパーティライブラリ
これらのライブラリは、追加機能やユーティリティを提供する可能性がありますが、導入とセットアップが必要となります。
適切な方法の選択
どの方法が最適かは、プロジェクトの要件と好みによって異なります。 enum は、シンプルで使いやすく、可読性が高いという点で一般的に良い選択です。 文字列リテラル型は、型安全性が高いことを重視する場合に適しています。 サードパーティライブラリは、より高度な機能が必要な場合に検討することができます。
考慮すべき点:
- 可読性
- 保守性
- 型安全性
- 追加機能の必要性
typescript definition