TypeScriptには、JavaやC#などの他の言語で一般的なオブジェクト指向のパターンをサポートするために、クラスの型と継承が追加されました。TypeScriptは、プロパティとメソッドの型を明示的に定義するクラスを作成し、型の安全性を持つ継承を実現できます。
JavaScriptでは明示的な型付けがないため、プロパティの誤用に起因するエラーはコンパイル時に検出されません。問題は、子クラスによるメソッド/プロパティのオーバーライド、基底クラスの契約の違反、およびprotected/privateの誤った使用時に発生します。
TypeScriptでは、public、private、protectedキーワードを使用し、プロパティとメソッドの型を明示的に指定し、extendsを使用してクラスを継承し、インターフェースを実装できます。
コードの例:
class Animal { public name: string; protected age: number; private secret: string = "hidden"; constructor(name: string, age: number) { this.name = name; this.age = age; } speak(): void { console.log(`${this.name} makes a sound.`); } } class Dog extends Animal { constructor(name: string, age: number) { super(name, age); } speak(): void { console.log(`${this.name} barks.`); } } const dog = new Dog("Rex", 4); dog.speak(); // Rex barks.
主な特徴:
クラスのフィールドに型を指定しなかったらどうなりますか?
TypeScriptは、もし値が与えられている場合、型を推論しようとします。与えられない場合、型はanyになり、コードの安全性が低下します。
class Test { value; constructor(v: number) { this.value = v; } }
デフォルト値が指定されていない場合、valueはany型になります。これは型安全性の潜在的な脆弱性です。
継承したメソッドのアクセス修飾子を変更できますか?
はい、強化する形で変更できます(例えば、publicからprotectedに変更できますが、その逆はできません)。しかし、privateからpublicには変更できません。これは、privateメンバーは継承されないためです。これによりコンパイルエラーが発生します。
TypeScriptで複数のクラスから継承できますか?
いいえ、クラスの多重継承は禁止されています。複数のインターフェースを実装できますが、クラスからは1つだけextendsできます。
プロジェクト内のすべてのクラスがアクセス修飾子と明示的な型なしで宣言され、開発の迅速化が図られました。
長所:
短所:
クラスのすべてのメンバーは慎重に型付けされ、private/protected/publicが使用され、プロパティとメソッドの厳格な型付けが行われています。
長所:
短所: