私のクラスは次のとおりですManager
:
class Manager{
/**
* Elements that are managed by the manager.
*/
private _elements: PIXI.DisplayObject[];
TextureManager
およびを拡張するクラスManager
:
export class TextureManager extends Game.Managers.Manager{
private _elements: PIXI.DisplayObjectContainer[];
}
ご存知のとおり、PIXI.DisplayObjectContainer
は拡張されますPIXI.DisplayObject
。
同じタイプだからそう思う(同じオブジェクトに基づくPIXI.DisplayObject
:)型の変更は可能であるべきである。(少なくともJavaのような実際のOOP言語では可能である。もし私が正確に覚えていれば)
しかし、コンパイル中にこのエラーメッセージが表示されます。どうすればよいでしょうか?
TextureManager.ts(9,18): エラー TS2416: クラス 'TextureManager' が基本クラス 'Manager' を誤って拡張しています:
型にはプライベート プロパティ '_elements' の個別の宣言があります。
解決:
単純な解決策のように思えるかもしれませんが、TS は1.3
3 日ほど前にリリースされ、本当に望んでいたprotected
属性のサポートが追加されました。また、属性で機能しているようで、protected
型の変更は問題なく機能します。親クラスprotected _elements: any;
に設定しManager
、任意の子で必要な型をカスタマイズするだけですprotected _elements: Game.Core.Texture;
。かなりクールです。
私の IDE (WebStorm) は TS 1.3 のサポートをリリースしていないため、どこでも赤くなってしまいますが、チェックインすることでTrigger watcher regardless of syntax error
動作File watcher
するようになりました。サポートは近日中に開始されます:https://youtrack.jetbrains.com/issue/WEB-14149
ベストアンサー1
TypeScript では、プライベート クラス メンバーをオーバーライドすることはできません。数日前にリリースされたバージョン 1.3 より前では、TS には と の 2 つのアクセシビリティ修飾子しかなかったためprivate
、public
ここでの唯一の解決策は を使用することですpublic
。
バージョン 1.3 で変更されました。プライベート メンバーは依然としてオーバーライドできませんが、TS 1.3 ではprotected
アクセシビリティ修飾子が導入されています。これにより、クラス外からプロパティにアクセスできなくなりますが、サブクラスからメンバーにアクセスできるようになります。これは、質問に関連します。上書きを許可する(ただし、オーバーライドするプロパティのタイプは、オーバーライドされるプロパティに割り当て可能である必要があります)。
したがって、この場合は TypeScript 1.3 を使用し、_elements
保護を設定して、オーバーライド可能な型を指定します。