2015-03-27 2 views
1

Existe-t-il un moyen simple de modifier le type de retour d'une méthode lors de l'extension d'une classe sans avoir à la définir explicitement dans chaque nouvelle définition? Je voudrais simplifier mes définitions qui ressemblent à ceci ...Méthode de chaînage lors de l'extension de classes TypeScript

declare class Foo { 
    add(): Foo; 
} 

declare class Bar extends Foo { 
    add(): Bar; 
    remove(): Bar; 
} 

declare class Baz extends Bar { 
    add(): Baz; 
    remove(): Baz; 
    destroy(): Baz; 
} 

// Usage... 
var foo = new Foo().add();  
var bar = new Bar().add().remove();  
var baz = new Baz().add().remove().destroy(); 
+0

Ce n'est pas idéal, mais cela est la façon dont je le fais: http://stackoverflow.com/a/23024723/188246 - Peut-être qu'il ya une meilleure façon que quelqu'un sait bien? –

+0

Je pourrais le faire fonctionner pour la classe 'Bar', mais pas pour la classe' Baz'. –

+0

oh ouais, ça ne marche pas pour plus d'une couche d'héritage :( –

Répondre

1

J'ai été capable d'y parvenir en modifiant un peu l'exemple de David. Ce n'est pas idéal, mais ça fonctionne.

declare class IFoo<T> { 
    add(): T; 
} 

declare class IBar<T> extends IFoo<T> { 
    remove(): T; 
} 

declare class IBaz<T> extends IBar<T> { 
    destroy(): T; 
} 

declare class Foo extends IFoo<Foo> { } 
declare class Bar extends IBar<Bar> { } 
declare class Baz extends IBaz<Baz> { } 

// Okay 
var foo = new Foo().add(); 
var bar = new Bar().add().remove(); 
var baz = new Baz().add().remove().destroy(); 

Working example