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

直し方: 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 にします。

この問題を解いてみる →

パターン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);
main.ts(7,11): error TS2511: Cannot create an instance of an abstract class.

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);
main.ts(7,11): error TS2511: Cannot create an instance of an abstract class.

Beverageはabstractクラスです。brewを実装したTeaのようなサブクラス経由でしかインスタンス化できません。

直し方: Beverage を Tea にします。

この問題を解いてみる →

よくある誤解

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

実務での勘所

Java、C#、PHPのabstractクラスは、実行時のランタイム自身が直接インスタンス化を禁止しますが、TypeScriptのabstractはコンパイル時のtscによる検査だけです。コンパイル後のJavaScriptでは、abstractクラスはただの通常のクラスになり、abstractという制約の情報は一切残りません。この安全性は、あくまでtscによる検査を通すという運用があって初めて成立しています。

演習をはじめる

関連するエラー

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