TypeScript - 子のプロパティタイプを変更することは可能ですか? 質問する

TypeScript - 子のプロパティタイプを変更することは可能ですか? 質問する

私のクラスは次のとおりです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.33 日ほど前にリリースされ、本当に望んでいた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 つのアクセシビリティ修飾子しかなかったためprivatepublicここでの唯一の解決策は を使用することですpublic

バージョン 1.3 で変更されました。プライベート メンバーは依然としてオーバーライドできませんが、TS 1.3 ではprotectedアクセシビリティ修飾子が導入されています。これにより、クラス外からプロパティにアクセスできなくなりますが、サブクラスからメンバーにアクセスできるようになります。これは、質問に関連します。上書きを許可する(ただし、オーバーライドするプロパティのタイプは、オーバーライドされるプロパティに割り当て可能である必要があります)。

したがって、この場合は TypeScript 1.3 を使用し、_elements保護を設定して、オーバーライド可能な型を指定します。

おすすめ記事