TypeScriptのinterfaceとオブジェクト指向のclassは似た役割を持つ部分もありますが、
同じではありません。
型安全かつオブジェクト指向的なプログラミングを実現する為、役割が変わります。
・型安全:interface(TypeScript)
・オブジェクト指向:class(オブジェクト指向)
以下にその違いと関係性を説明します。
1. interfaceとclassの共通点
- 型の構造を定義する:
interfaceはオブジェクトの構造(プロパティやメソッド)を定義します。classも、プロパティやメソッドを定義してインスタンスを生成するための
設計図になります。
- 型チェックに使われる:
- TypeScriptでは、
classとinterfaceの両方を型チェックに利用できます。
- TypeScriptでは、
共通点の例
typescriptinterface Animal {
name: string;
speak(): void;
}
class Dog implements Animal {
name: string;
constructor(name: string) {
this.name = name;
}
speak() {
console.log(`${this.name} says: Woof!`);
}
}
const dog: Animal = new Dog("Buddy");
dog.speak(); // "Buddy says: Woof!"
DogクラスはAnimalインターフェースの定義に従っているため、Animal型として扱うことができます。
2. interfaceとclassの違い
| 項目 | interface | class |
|---|---|---|
| インスタンス生成 | インスタンスを生成できない | インスタンスを生成できる |
| 実装 | 実装は持たず、構造(型)のみ定義 | プロパティやメソッドの実装を持つ |
| 拡張 | 他のインターフェースをextendsして拡張できる | 他のクラスをextendsして継承できる |
| 多重継承 | 複数のインターフェースを同時にextendsできる | 単一継承のみ可能(1つのクラスだけをextendsできる) |
| 型システムの機能 | 型チェックのみを目的とする | 実際の実行時のオブジェクトとして振る舞う |
(1) 実装がない
interfaceには実装(具体的な処理)を記述することはできませんが、classはできます。
typescript// interface: 実装を持たない
interface Shape {
area(): number;
}
// class: 実装を持つ
class Circle implements Shape {
constructor(private radius: number) {}
area() {
return Math.PI * this.radius * this.radius;
}
}
const circle = new Circle(5);
console.log(circle.area()); // 78.53981633974483
(2) インスタンス生成
interfaceは型情報を提供するだけで、インスタンスを生成することはできません。
一方、classはインスタンスを生成するために使用します。
typescriptinterface User {
name: string;
}
// const user = new User(); // エラー: インターフェースからはインスタンスを作れない
class Person {
constructor(public name: string) {}
}
const person = new Person("Alice"); // クラスからはインスタンスを作れる
(3) 継承
interfaceは多重継承が可能ですが、classは単一継承しかできません。
typescript// interfaceの多重継承
interface A {
propA: string;
}
interface B {
propB: number;
}
interface C extends A, B {}
const obj: C = { propA: "Hello", propB: 42 };
// classの単一継承
class Parent {
propA = "Hello";
}
class Child extends Parent {
propB = 42;
}
// class Child extends Parent, AnotherParent {} // エラー: 単一継承のみ可能
3. interfaceとclassの組み合わせ
interfaceはclassと組み合わせて使われることが一般的です。interfaceを使って型を定義し、それをclassが実装する形です。
typescriptinterface Drivable {
drive(): void;
}
class Car implements Drivable {
drive() {
console.log("The car is driving");
}
}
const car: Drivable = new Car();
car.drive(); // "The car is driving"
4. どちらを使うべきか?
interfaceを使う場合:- 型定義が目的の場合。
- オブジェクトの構造を定義したい場合。
- 多重継承が必要な場合。
classを使う場合:- インスタンスを生成する必要がある場合。
- 実装を含めたい場合。
- 単一継承でオブジェクト指向プログラミングを実現したい場合。
結論
interfaceとclassはオブジェクトの構造を定義する点で似ていますが、
目的や使い方が異なります。interfaceは型チェックのために使用され、classは実際のオブジェクトを作成するために
使用されます。両者を組み合わせることで、型安全かつオブジェクト指向的な
プログラミングが可能になります。



