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);
main.ts(7,11): error TS2511: Cannot create an instance of an abstract class.
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);
main.ts(7,11): error TS2511: Cannot create an instance of an abstract class.
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);
main.ts(7,11): error TS2511: Cannot create an instance of an abstract class.
Vehicleはabstractクラスなので、そのままではインスタンス化できません。Carのようなサブクラスが必要です。
直し方: Vehicle を Car にします。
よくある誤解
「abstractは単なる命名の慣習で、実際にはnewできるはず」という考えは誤りです。abstractキーワードはtscが検査する制約で、直接のインスタンス化を実行前に禁止します。
まとめ
abstractクラスを直接newした原因と直し方は中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。