abstractクラスを直接newした原因と直し方
abstractを付けたクラスは、そのままnewでインスタンス化することができません。abstractクラスは「共通の骨組みだけを定義し、具体的な実装はサブクラスに任せる」ためのクラスです。
エラーメッセージの読み方
main.ts(7,11): error TS2511: Cannot create an instance of an abstract class.
main.ts- ファイル名
7- 行番号
11- 列番号 — この位置でtscが検査に失敗しました
TS2511- エラーコード — 検索するとTypeScriptの解説が見つかります
Cannot create an instance of an abstract class.- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 abstract class Shape { 2 abstract area(): number; 3 } 4 class Circle extends Shape { 5 area(): number { return 3.14; } 6 } 7 const s = new Shape (); ^ 8 console.log(s);
Shapeはabstractクラスなので直接newできません。areaを実装したCircleのようなサブクラス経由でインスタンス化します。
直し方: Shape を Circle にします。
パターン2
1 abstract class Animal { 2 abstract speak(): string; 3 } 4 class Dog extends Animal { 5 speak(): string { return "woof"; } 6 } 7 const a = new Animal(); ^ 8 console.log(a);
Animalはabstractクラスです。speakを実装したDogのようなサブクラス経由でしかインスタンス化できません。
直し方: Animal を Dog にします。
パターン3
1 abstract class Vehicle { 2 abstract wheels(): number; 3 } 4 class Car extends Vehicle { 5 wheels(): number { return 4; } 6 } 7 const v = new Vehicle(); ^ 8 console.log(v);
Vehicleはabstractクラスなので、そのままではインスタンス化できません。Carのようなサブクラスが必要です。
直し方: Vehicle を Car にします。
パターン4
1 abstract class Instrument { 2 abstract play(): string; 3 } 4 class Piano extends Instrument { 5 play(): string { return "plink"; } 6 } 7 const x = new Instrument(); ^ 8 console.log(x);
Instrumentはabstractクラスなので直接newできません。
直し方: Instrument を Piano にします。
パターン5
1 abstract class Beverage { 2 abstract brew(): string; 3 } 4 class Tea extends Beverage { 5 brew(): string { return "hot"; } 6 } 7 const b = new Beverage(); ^ 8 console.log(b);
Beverageはabstractクラスです。brewを実装したTeaのようなサブクラス経由でしかインスタンス化できません。
直し方: Beverage を Tea にします。
よくある誤解
「abstractは単なる命名の慣習で、実際にはnewできるはず」という考えは誤りです。abstractキーワードはtscが検査する制約で、直接のインスタンス化を実行前に禁止します。
実務での勘所
Java、C#、PHPのabstractクラスは、実行時のランタイム自身が直接インスタンス化を禁止しますが、TypeScriptのabstractはコンパイル時のtscによる検査だけです。コンパイル後のJavaScriptでは、abstractクラスはただの通常のクラスになり、abstractという制約の情報は一切残りません。この安全性は、あくまでtscによる検査を通すという運用があって初めて成立しています。