TypeScript - 更改子项中的属性类型,是否可能?

时间:2014-11-15 15:02:40

标签: inheritance typescript override

我有一个班级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,所以类型更改应该是可能的。 (至少它是真正的OOP语言,如Java,,如果我没记错的话

但是我在编译期间收到此错误消息。我该怎么办?

  

TextureManager.ts(9,18):错误TS2416:Class' TextureManager'错误地扩展基类'经理':
  类型具有私有财产的单独声明' _elements'。

解决方案:

这似乎是一个简单的解决方案,但TS 1.3刚刚发布,就像3天前一样,并添加了对-really wanted- protected属性的支持。并且它似乎与protected属性一起使用它可以正常工作以更改类型,我只需在protected _elements: any;父类上设置Manager并在任何子级中自定义我想要的类型{ {1}}。很酷。

由于我的IDE(WebStorm)尚未发布对TS 1.3的支持,我到处都变红了,但通过检查protected _elements: Game.Core.Texture;中的Trigger watcher regardless of syntax error我能够使其正常工作。即将推出支持:https://youtrack.jetbrains.com/issue/WEB-14149

1 个答案:

答案 0 :(得分:24)

您无法覆盖TypeScript中的私有类成员。在几天前发布的1.3版之前,TS中只有2个可访问性修饰符:privatepublic,因此这里唯一的解决方案是使用public。< / p>

它在版本1.3中发生了变化。虽然私有成员仍然无法覆盖,但TS 1.3引入了protected辅助功能修饰符。它仍然阻止在类外部访问属性,但是它允许在子类中访问成员,并且与问题更相关,允许覆盖(但是覆盖的属性类型仍然必须可分配给覆盖的一个。)

因此,在这种情况下,只需使用TypeScript 1.3,使_elements受到保护,并为其提供一个可以覆盖的类型。