問題の概要TypeScriptは通常、ロジックのバグを検出しますが、エラー TS4114 は構造的な整合性に関するものです。依存関係を更新したか、noImplicitOverride フラグが有効になっているコードベースを継承した可能性があります。ビルドを実行すると、コンパイラは次のような特定の要求でブロックします。
TS4114: This member must have an 'override' modifier because it overrides a member in the base class 'Animal'.
これはランタイムのバグではありません。むしろ、メンテナンス中に誤ってクラスの階層構造を壊してしまうのを防ぐために設計された安全チェックです。
エラーが発生するコードこのエラーは、子クラスが親クラスのメソッドを再定義する際に、その意図を明示的に示していない場合に発生します。数十の継承クラスがあるコードベースでは、どのメソッドが独自のもので、どれがオーバーライドされたものかを見失いやすくなります。
class Animal {
makeSound(): void {
console.log("一般的な鳴き声");
}
}
class Dog extends Animal {
// エラー: 意図が曖昧なため、ここで TS4114 が発生します
makeSound(): void {
console.log("ワンワン!");
}
}
このエラーが存在する理由バージョン 4.3 以降、TypeScript は「壊れやすい基底クラス(fragile base class)」問題を解決するために override キーワードを提供しています。この修飾子を強制することで、次の 2 つの一般的なシナリオから保護されます。
- 偶発的なシャドウイング: 親クラスに全く同じ名前のメソッドが既に存在することに気づかずに、子クラスにメソッドを追加してしまうケース。- サイレントなリファクタリングの失敗: 基底クラスで
makeSoundをemitSoundに名前変更した場合。overrideキーワードがないと、子クラスのmakeSoundは親のロジックを特化したものではなく、無関係な単独のメソッドになってしまいます。## TS4114 の修正方法### 1. 標準的な解決策: 明示的なオーバーライドこの問題を解決する最善の方法は、overrideキーワードを使用することです。これにより、子クラスと親クラスの間に明確な契約が作成されます。コンパイラ、そして将来のデベロッパーに対して、コードが何をしようとしているのかを正確に伝えます。
class Dog extends Animal {
override makeSound(): void {
console.log("ワンワン!");
}
}
後で基底クラスのメソッドがなくなった場合、TypeScript は TS4113 をスローします。この即時のフィードバックにより、子クラスが存在しない親メソッドを参照し続けることがなくなります。
2. グローバルな回避策 (TSConfig)50以上のエラーがあるレガシープロジェクトを移行中で、すぐにビルドを成功させる必要がある場合は、このチェックを無効にできます。ただし、これにより重要なセーフティネットが失われることに注意してください。
tsconfig.json の compilerOptions セクションを更新します。
{
"compilerOptions": {
"noImplicitOverride": false
}
}
これを false に設定すると、オーバーライドが常に暗黙的であった古い TypeScript バージョンの動作に戻ります。
3. コンストラクタに関する注意点コンストラクタは特殊です。親クラスに独自のコンストラクタがある場合でも、override キーワードは必要ありません。このルールはメソッドとプロパティにのみ適用されます。
検証「no emit」モードでコンパイラを実行して、変更を検証します。これにより、JavaScript ファイルを生成せずにエラーをチェックできます。
npx tsc --noEmit
VS Code では、赤いエラーのハイライトがすぐに消えるはずです。エラーが残る場合は、Ctrl+Shift+P を使用して TypeScript: Restart TS Server を選択し、IDE の状態をリフレッシュしてください。

