2017-06-14 3 views
2

Je souhaite qu'un composeur Typescript dispose d'une méthode abstraite implémentée par la classe mélangée dans. Quelque chose comme ça.Méthodes abstraites dans les mixages tapuscrits

class MyBase { 
} 

type Constructor<T = {}> = new (...args: any[]) => T; 

function Mixin<TBase extends Constructor<MyBase>>(Base: TBase) { 
    return class extends Base { 

    baseFunc(s: string) {}; 

    doA() 
    { 
     this.baseFunc("A"); 
    } 
    } 
}; 

class Foo extends Mixin(MyBase) { 
    constructor() 
    { 
     super(); 
    } 

    baseFunc(s: string) 
    { 
     document.write("Foo "+ s +"... ")    
    } 
}; 

Maintenant, cela fonctionne, mais je voudrais vraiment faire baseFunc dans le mixin être abstrait pour vous assurer qu'il est mis en œuvre Foo. Est-il possible de le faire, comme abstract baseFunc(s:string); dit que je dois avoir une classe abstraite, ce qui est interdit pour mixins ...

Répondre

2

classe anonyme ne peut pas être abstraite, mais vous pouvez toujours déclarer la classe mixin locale qui est abstrait comme ceci:

class MyBase { 
} 

type Constructor<T = {}> = new (...args: any[]) => T; 

function Mixin(Base: Constructor<MyBase>) { 
    abstract class AbstractBase extends Base { 
    abstract baseFunc(s: string);  
    doA() 
    { 
     this.baseFunc("A"); 
    } 
    } 
    return AbstractBase; 
}; 


class Foo extends Mixin(MyBase) { 
    constructor() 
    { 
     super(); 
    } 

    baseFunc(s: string) 
    { 
     document.write("Foo "+ s +"... ")    
    } 
}; 
+0

Je pensais que j'avais essayé cela! Pourquoi "ne pas retourner la classe abstraite ..." travail? (edit - ah parce que c'est anonyme!) – Roddy

+0

Cet exemple perd les méthodes et les propriétés de MyBase. Vous pouvez corriger avec 'la fonction Mixin > (Base: B)'. –