見出し画像

TypeScript 入門の記録(63)プロを目指す人のためのTypeScript入門(47)第5章TypeScriptのクラス(7)

 昨日は、日本UNIXユーザー会40周年記念イベント「コロナテックカンファレンス」が開催されました。私は、その会場サポートのため出張予定だったのですが、家族が COVID-19に感染したので出張をキャンセル。代わりに、登壇者として出張していた西原(@tomio2480)さんに、現地対応をお願いして、私はオンラインでサポートしました。今日は自宅で、TypeScriptのクラスの継承の続き、override修飾子について学習します。


クラスの継承

 TypeScript のクラス内のプロパティやメソッドに付加する override 修飾子について学習します。

override修飾子

 override修飾子は、クラス内のプロパティやメソッドがオーバーライドであることを宣言します。
override修飾子は、継承していないプロパティやメソッドに override修飾子を付加するとコンパイルエラーが発生します。クラスの継承では、override修飾子がなくてもオーバーライドできるので、必須ではありません。

オーバーライドしていないプロパティのrank に override 修飾子を付加すると、「This member cannot have an 'override' modifier because it is not decleared in base class 'User532' 」が発生する
親クラスの要素ではないrankにoverride修飾子を付加すると、エラー

noImplicitOverride コンパイラオプション

コンパイラオプション noImplicitOverride を有効にすると、オーバーライドには、必ずoverride修飾子を付加する必要があります。「オーバーライドしたつもりができていなかったり、オーバーライドするつもりがないのにオーバーライドしてしまった」というミスを防ぐ効果が期待できます。noimplicitOverrideは、デフォルトでは無効なので、tsconfig.json で有効にする必要があります。
tsconfig.json のnoImplicitOverride は、コメントアウトされているので

    // "noImplicitOverride": true,                       /* Ensure overriding members in derived classes are marked with an override modifier. */

オーバーライドにoverride修飾子がなくてもエラーにはなりません。

isAdultメソッドはオーバーライドだが、override修飾子がなくても正常

これを、有効にします。

"noImplicitOverride": true,                       /* Ensure overriding members in derived classes are marked with an override modifier. */

isAdultメソッドに override修飾子がないので、コンパイルエラーが発生しました。

isAdultメソッドでoverride修飾子が不足しているコンパイルエラーが発生している

なお、複数の修飾子がある場合は、記述する順番がきまっていて、public override のように書かないとエラーです。

まとめ

今日は、override修飾子と、コンパイルオプション noImplicitOverride の組み合わせの効果について学習しました。継承とオーバーライドのミス予防に override修飾子と noImplicitOverrideオプションをうまく活用したいと思います。





この記事が気に入ったらサポートをしてみませんか?