TypeScriptは、JavaScriptのスーパセット(上位互換)であり、静的型付けが特徴です。そのため、JavaScriptでは実現できない型安全性を確保しつつ、オブジェクト指向プログラミング(OOP)をより強力にサポートしています。TypeScriptの重要な機能の一つが**クラス(Class)**です。この記事では、TypeScriptでクラスを実装する方法について、具体例を交えながら解説します。
クラスとは?
クラスは、オブジェクトを生成するための設計図です。クラスを使うことで、オブジェクトにプロパティ(属性)やメソッド(機能)を定義できます。TypeScriptのクラスは、JavaScriptのクラスと基本的な仕組みは同じですが、型定義やアクセス修飾子など、より高度な機能が追加されています。
基本的なクラスの定義
まずは、TypeScriptでのクラス定義の基本を見てみましょう。以下は、Person
というクラスを定義した例です。
class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
const person1 = new Person('Alice', 30);
person1.greet(); // "Hello, my name is Alice and I am 30 years old."
このコードでは、以下の要素を含んでいます:
- プロパティの宣言:
name
とage
という2つのプロパティを宣言しています。それぞれ、string
型とnumber
型として定義されています。 - コンストラクタ: クラスが生成されたときに呼び出されるメソッドで、
name
とage
を初期化します。 - メソッド:
greet
メソッドは、コンソールに自己紹介のメッセージを出力します。
アクセス修飾子
TypeScriptでは、クラスのプロパティやメソッドに対してアクセス修飾子を指定することができます。これにより、どの範囲でプロパティやメソッドを利用できるかを制御できます。TypeScriptがサポートする主なアクセス修飾子は以下の3つです。
- public: デフォルトの修飾子です。クラスの外部からもアクセス可能です。
- private: クラスの内部からのみアクセス可能です。
- protected: クラス自身と、そのクラスを継承した子クラスからアクセス可能です。
例えば、Person
クラスのname
プロパティをprivate
にする場合、以下のように書きます。
class Person {
private name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
changeName(newName: string) {
this.name = newName;
}
}
const person1 = new Person('Alice', 30);
// person1.name = 'Bob'; // エラー: 'name' is private and only accessible within class 'Person'.
person1.changeName('Bob');
person1.greet(); // "Hello, my name is Bob and I am 30 years old."
ここで、name
プロパティはクラスの外部から直接変更することができなくなりましたが、changeName
メソッドを使って変更することは可能です。
継承とポリモーフィズム
TypeScriptでは、クラスを継承して新しいクラスを作成できます。これにより、既存のクラスの機能を再利用しつつ、独自の機能を追加することができます。また、継承を利用することで、オブジェクト指向プログラミングの重要な概念であるポリモーフィズム(多態性)も実現できます。
以下の例では、Employee
クラスがPerson
クラスを継承しています。
class Employee extends Person {
employeeId: number;
constructor(name: string, age: number, employeeId: number) {
super(name, age); // 親クラスのコンストラクタを呼び出す
this.employeeId = employeeId;
}
greet() {
console.log(`Hello, my name is ${this.name} and I work as an employee with ID ${this.employeeId}.`);
}
}
const employee1 = new Employee('Bob', 25, 101);
employee1.greet(); // "Hello, my name is Bob and I work as an employee with ID 101."
この例では、Employee
クラスがPerson
クラスを継承し、greet
メソッドをオーバーライドしています。また、super
を使って親クラスのコンストラクタを呼び出し、name
とage
を初期化しています。
静的メンバー(Static Members)
TypeScriptでは、クラスに属する静的メンバーを定義することができます。静的メンバーは、クラス自体に紐付いており、インスタンスを生成しなくてもアクセス可能です。
class MathHelper {
static PI: number = 3.14;
static circumference(diameter: number): number {
return this.PI * diameter;
}
}
console.log(MathHelper.PI); // 3.14
console.log(MathHelper.circumference(10)); // 31.4
ここでは、MathHelper
クラスに静的なPI
プロパティとcircumference
メソッドを定義しています。これらはインスタンスではなく、クラス名を通じて直接アクセスします。
まとめ
TypeScriptのクラスは、オブジェクト指向プログラミングの強力な機能を提供します。アクセス修飾子や継承、静的メンバーといった機能を活用することで、堅牢で再利用可能なコードを効率的に構築できます。TypeScriptを使ってクラスを実装することで、JavaScriptの柔軟性に型安全性を加えた、よりメンテナブルなアプリケーションの開発が可能になります。