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

Vad*_*est 14 inheritance overriding typescript

我有一节课Manager:

class Manager{
    /**
     * Elements that are managed by the manager.
     */
    private _elements: PIXI.DisplayObject[];
Run Code Online (Sandbox Code Playgroud)

和一个TextureManager扩展的类Manager:

export class TextureManager extends Game.Managers.Manager{
    private _elements: PIXI.DisplayObjectContainer[];
}
Run Code Online (Sandbox Code Playgroud)

只是你知道,PIXI.DisplayObjectContainer延伸PIXI.DisplayObject.

我相信,因为它是同一类型(基于同一对象上:PIXI.DisplayObject),类型的变化应该是可能的.(至少它是真正的OOP语言,如Java,如果我没记错的话)

但是在编译期间我收到此错误消息.我应该怎么做?

TextureManager.ts(9,18):错误TS2416:类'TextureManager'错误地扩展了基类'Manager':
类型具有私有属性'_elements'的单独声明.

解:

它似乎是一个简单的解决方案,但TS 1.3刚刚发布,就像3天前一样,并添加了对-really 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

Kub*_*oda 25

您无法在TypeScript中覆盖私有类成员.版本1.3,这是公布的前几天之前,有2只访问修饰符在TS:private和public,所以这里唯一的解决办法是使用public.

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

因此,在这种情况下,只需使用TypeScript 1.3,make _elementsprotected并为其提供一个可以覆盖的类型.

  • 我刚刚发现另一种解决方案是使用`generics<type>`,请参阅以下内容:http://blogs.msdn.com/b/typescript/archive/2014/11/12/annoucing-typescript-1-3 .aspx (2认同)