Code Fix

中級

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のようなサブクラス経由でインスタンス化します。

直し方: ShapeCircle にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン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のようなサブクラス経由でしかインスタンス化できません。

直し方: AnimalDog にします。

この問題を解いてみる →

パターン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のようなサブクラスが必要です。

直し方: VehicleCar にします。

この問題を解いてみる →

よくある誤解

「abstractは単なる命名の慣習で、実際にはnewできるはず」という考えは誤りです。abstractキーワードはtscが検査する制約で、直接のインスタンス化を実行前に禁止します。

まとめ

abstractクラスを直接newした原因と直し方は中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)