2014-11-15 7 views
13

Ho una classe Manager:TypeScript - Cambia il tipo di proprietà in child, è possibile?

class Manager{ 
    /** 
    * Elements that are managed by the manager. 
    */ 
    private _elements: PIXI.DisplayObject[]; 

e una classe che estende la TextureManagerManager:

export class TextureManager extends Game.Managers.Manager{ 
    private _elements: PIXI.DisplayObjectContainer[]; 
} 

Solo così si sa, PIXI.DisplayObjectContainer estende PIXI.DisplayObject.

credo che perché è lo stesso tipo (basato sullo stesso oggetto: PIXI.DisplayObject), il cambiamento di tipo dovrebbe essere possibile. (almeno è in linguaggio OOP reale, come Java, se ricordo correttamente)

Ma ricevo questo messaggio di errore durante la compilazione. Come dovrei fare?

TextureManager.ts (9,18): errore TS2416: Class 'TextureManager' si estende in modo non corretto classe base 'Manager':
tipi hanno dichiarazioni separate di una proprietà privata '_elements'.

Soluzione:

Può sembrare una soluzione semplice, ma TS 1.3 è stato appena rilasciato come 3 giorni fa e aggiungere il supporto per l'attributo -really volevamo- protected. E sembra funzionare con un attributo protected che funziona bene per cambiare il tipo, ho appena impostato protected _elements: any; sulla classe genitore Manager e personalizzare il tipo come voglio in qualsiasi bambino protected _elements: Game.Core.Texture;. Molto carino.

Sono appena diventato rosso ovunque dal mio IDE (WebStorm) non ha rilasciato un supporto per TS 1.3, ma controllando Trigger watcher regardless of syntax error nel File watcher sono riuscito a farlo funzionare. Supporto disponibile a breve: https://youtrack.jetbrains.com/issue/WEB-14149

+0

Quale versione di TypeScript usi? Nella versione 1.3, rilasciata pochi giorni fa, è stata introdotta la parola chiave 'protected' e probabilmente sarebbe utile qui. –

+0

1.3, installato oggi. Non ci ho pensato. Proveremo. – Vadorequest

+0

Funziona, grazie. Fortunatamente è appena stato rilasciato. – Vadorequest

risposta

22

Non è possibile eseguire l'override di un membro di classe privato in TypeScript. Prima della versione 1.3, rilasciata pochi giorni fa, c'erano solo 2 modificatori di accessibilità in TS: private e public, quindi l'unica soluzione sarebbe utilizzare public.

È stato modificato nella versione 1.3. Mentre i membri privati ​​non possono ancora essere sostituiti, TS 1.3 introduce il modificatore di accessibilità protected. Impedisce comunque l'accesso alla proprietà al di fuori della classe, tuttavia consente l'accesso ai membri in sottoclassi e, che è più pertinente alla domanda, consente di ignorare (ma il tipo di proprietà che sostituisce deve essere ancora assegnabile a quello dell'override uno).

Quindi, in questo caso, è sufficiente utilizzare TypeScript 1.3, rendere protetto _elements e assegnargli un tipo che è possibile escludere.

+0

Ho appena scoperto che un'altra soluzione è usare 'generics ', vedere quanto segue: http://blogs.msdn.com/b/typescript/archive/2014/11/12/announcing-typescript-1-3. aspx – Vadorequest