TypeScriptのEnum: 関数やジェネリック型で賢く活用
TypeScriptにおけるEnumをパラメータとして使用する
Enumをパラメータとして使用する基本例
enum Color { Red, Green, Blue } // 列挙型を定義
function printColor(color: Color) { // Enum型をパラメータとして使用する関数
console.log(color); // 例: "Red"
}
printColor(Color.Red); // 関数呼び出し
この例では、Color
という列挙型を定義し、Red
、Green
、Blue
という値を持つようにしています。 printColor
という関数は、Color
型の引数を受け取り、コンソールにその値を出力します。
関数シグネチャにおけるEnumパラメータの利点
- 型安全性: コンパイラは引数が確実に
Color
型のいずれかの値であることを確認するため、誤った型の値が渡されるのを防ぎます。 - コードの読みやすさ: 関数の引数が何を表しているのかを、コードを見ただけで理解しやすくなります。
- メンテナンス性: コードを変更する際に、どの型の値が渡されているのかを把握しやすくなります。
ジェネリック型におけるEnumパラメータの使用
Enumをジェネリック型の制約として使用することで、型安全なコードをさらに汎用化することができます。
enum Shape { Circle, Rectangle, Triangle } // 列挙型を定義
function getArea<T extends Shape>(shape: T, dimensions: [number, number]): number {
switch (shape) {
case Shape.Circle:
return Math.PI * dimensions[0] * dimensions[0];
case Shape.Rectangle:
return dimensions[0] * dimensions[1];
case Shape.Triangle:
return 0.5 * dimensions[0] * dimensions[1];
}
}
const circleArea = getArea(Shape.Circle, [5, 0]); // Enum値をジェネリック型引数として渡す
console.log(circleArea); // 78.53975
この例では、Shape
という列挙型を定義し、Circle
、Rectangle
、Triangle
という値を持つようにしています。 getArea
というジェネリック関数は、T
型の引数を受け取り、その形状と寸法に基づいて面積を計算します。 T
はShape
型のいずれかの値に制約されているため、関数は常に正しい型の値を受け取ることになります。
その他の例
- Enumをスイッチ式ステートメントの条件として使用して、コードをより簡潔に記述することができます。
- Enumをオブジェクトのプロパティの型として使用して、より明確で型安全なデータ構造を定義することができます。
まとめ
Enumをパラメータとして使用することは、TypeScriptでより型安全で、読みやすく、メンテナンスしやすいコードを書くための強力なテクニックです。 関数シグネチャやジェネリック型と組み合わせることで、コードの汎用性と柔軟性をさらに高めることができます。
TypeScriptにおけるEnumをパラメータとして使用するサンプルコード
Enumをパラメータとして使用する基本例
enum Color { Red, Green, Blue } // 列挙型を定義
function printColor(color: Color) { // Enum型をパラメータとして使用する関数
console.log(color); // 例: "Red"
}
printColor(Color.Red); // 関数呼び出し
関数シグネチャにおけるEnumパラメータの利点
enum Size { Small, Medium, Large } // 列挙型を定義
function getProduct(size: Size, price: number): number {
switch (size) {
case Size.Small:
return price * 0.8;
case Size.Medium:
return price;
case Size.Large:
return price * 1.2;
}
}
const smallProductPrice = getProduct(Size.Small, 10); // Enum値をパラメータとして渡す
console.log(smallProductPrice); // 8
説明:
この例では、Size
という列挙型を定義し、Small
、Medium
、Large
という値を持つようにしています。 getProduct
という関数は、Size
型の引数とprice
という数値引数を受け取り、製品の価格を計算します。 Enum値をパラメータとして渡すことで、関数は常に正しい型の値を受け取ることになります。
ジェネリック型におけるEnumパラメータの使用
enum Shape { Circle, Rectangle, Triangle } // 列挙型を定義
function getArea<T extends Shape>(shape: T, dimensions: [number, number]): number {
switch (shape) {
case Shape.Circle:
return Math.PI * dimensions[0] * dimensions[0];
case Shape.Rectangle:
return dimensions[0] * dimensions[1];
case Shape.Triangle:
return 0.5 * dimensions[0] * dimensions[1];
}
}
const circleArea = getArea(Shape.Circle, [5, 0]); // Enum値をジェネリック型引数として渡す
console.log(circleArea); // 78.53975
その他の例
例1: スイッチ式ステートメントの条件としてEnumを使用
enum UserRole { Admin, Editor, Reader } // 列挙型を定義
function getUserPermissions(role: UserRole): string[] {
switch (role) {
case UserRole.Admin:
return ['Can manage users', 'Can edit all content'];
case UserRole.Editor:
return ['Can edit content'];
case UserRole.Reader:
return ['Can read content'];
}
}
const adminPermissions = getUserPermissions(UserRole.Admin);
console.log(adminPermissions); // ['Can manage users', 'Can edit all content']
この例では、UserRole
という列挙型を定義し、Admin
、Editor
、Reader
という値を持つようにしています。 getUserPermissions
という関数は、UserRole
型の引数を受け取り、そのユーザーの権限を返します。 Enum値をスイッチ式ステートメントの条件として使用することで、コードをより簡潔に記述することができます。
例2: オブジェクトのプロパティの型としてEnumを使用
enum PaymentStatus { Pending, Approved, Rejected } // 列挙型を定義
interface Order {
id: number;
customerName: string;
items: string[];
totalPrice: number;
status: PaymentStatus; // Enum型をプロパティの型として使用する
}
const order: Order = {
id: 123,
TypeScriptにおけるEnumをパラメータとして使用するその他の方法
型ガードを使用して、関数の引数が確実に特定のEnum値であることを確認することができます。
enum Color { Red, Green, Blue } // 列挙型を定義
function isRed(color: Color): color is Color.Red { // 型ガード
return color === Color.Red;
}
function printColorInfo(color: Color) {
if (isRed(color)) {
console.log('The color is red');
} else {
console.log('The color is not red');
}
}
printColorInfo(Color.Red); // "The color is red"
printColorInfo(Color.Green); // "The color is not red"
この例では、isRed
という型ガード関数を作成しています。 この関数は、引数がColor.Red
であるかどうかを確認します。 printColorInfo
関数は、Color
型の引数を受け取り、型ガードを使用して引数がColor.Red
であるかどうかを確認します。
関数をオーバーロードして、異なるEnum型の引数を受け取る複数のバージョンを作成することができます。
enum Shape { Circle, Rectangle, Triangle } // 列挙型を定義
function getArea(shape: Circle, dimensions: [number]): number {
return Math.PI * dimensions[0] * dimensions[0];
}
function getArea(shape: Rectangle, dimensions: [number, number]): number {
return dimensions[0] * dimensions[1];
}
function getArea(shape: Triangle, dimensions: [number, number]): number {
return 0.5 * dimensions[0] * dimensions[1];
}
const circleArea = getArea(Shape.Circle, [5]); // Enum値をパラメータとして渡す
console.log(circleArea); // 78.53975
この例では、getArea
関数をオーバーロードしています。 この関数は、Circle
、Rectangle
、Triangle
のいずれかの型の引数を受け取り、その形状と寸法に基づいて面積を計算します。 関数オーバーロードを使用することで、コードをより明確で簡潔に記述することができます。
function getArea<T extends Shape>(shape: T, dimensions: [number, number]): number {
switch (shape) {
case Shape.Circle:
return Math.PI * dimensions[0] * dimensions[0];
case Shape.Rectangle:
return dimensions[0] * dimensions[1];
case Shape.Triangle:
return 0.5 * dimensions[0] * dimensions[1];
}
}
const circleArea = getArea(Shape.Circle, [5]); // Enum値をジェネリック型引数として渡す
console.log(circleArea); // 78.53975
この例は、前述のジェネリック型関数の例とほぼ同じですが、型パラメータを使用してshape
引数がShape
型のいずれかの値であることを宣言しています。 型パラメータを使用することで、コードの読みやすさと型安全性を向上させることができます。
カスタム型ガードを作成して、より複雑な条件に基づいて引数の型をチェックすることができます。
enum UserRole { Admin, Editor, Reader } // 列挙型を定義
function canEditContent(role: UserRole): boolean {
return role === UserRole.Admin || role === UserRole.Editor;
}
function getUserPermissions(role: UserRole): string[] {
switch (role) {
case UserRole.Admin:
return ['Can manage users', 'Can edit all content'];
case UserRole.Editor:
return canEditContent(role) ? ['Can edit content'] : [];
case UserRole.Reader:
return ['Can read content'];
}
}
const editorPermissions = getUserPermissions(UserRole.Editor);
console.log(editorPermissions); // ['Can edit content']
この例では、canEditContent
というカスタム型ガード関数を作成しています。 この関数は、引数がUserRole.Admin
またはUserRole.Editor
であるかどうかを確認します。 getUserPermissions
関数は
enums typescript