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 extends PIXI.DisplayObject.

Я считаю, что, поскольку он является одним и тем же типом (на основе одного и того же объекта: PIXI.DisplayObject), изменение типа должно быть возможным. (по крайней мере, на реальных языках ООП, таких как Java, если я правильно помню)

Но я получаю это сообщение об ошибке во время компиляции. Как мне это сделать?

TextureManager.ts(9,18): ошибка TS2416: Class 'TextureManager' неправильно расширяет базовый класс 'Manager':
Типы имеют отдельные декларации "_elements" частной собственности.

Решение:

Это может показаться простым решением, но TS 1.3 только что был выпущен, как и 3 дня назад, и добавьте поддержку атрибута thereally wanted- 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 защищенным и дайте ему тип, который можно переопределить.