我有一个班级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
答案 0 :(得分:24)
您无法覆盖TypeScript中的私有类成员。在几天前发布的1.3版之前,TS中只有2个可访问性修饰符:private
和public
,因此这里唯一的解决方案是使用public
。< / p>
它在版本1.3中发生了变化。虽然私有成员仍然无法覆盖,但TS 1.3引入了protected
辅助功能修饰符。它仍然阻止在类外部访问属性,但是它允许在子类中访问成员,并且与问题更相关,允许覆盖(但是覆盖的属性类型仍然必须可分配给覆盖的一个。)
因此,在这种情况下,只需使用TypeScript 1.3,使_elements
受到保护,并为其提供一个可以覆盖的类型。