2017-06-16 4 views
0

Ich versuche, eine generische Basisklasse für ein Protractor-Seitenobjekt zu schreiben. Dies ist eine reflexiv generische Klasse mit einer init-Methode, die sich selbst zurückgibt, nachdem sie auf angular gewartet oder nicht gewartet hat, abhängig davon, ob das Objekt eckig ist oder nicht. Ich möchte, dass die init-Methode den richtigen Typ zurückgibt - die Klasse, die die Basisklasse erweitert, aber ich bekomme einen Kompilierfehler, der sich darüber beschwert, dass ich 'this' nicht zurückgeben kann, weil es keine Instanz des generischen Parameters ist.Wie Reflexive generische Klasse in Typescript zu tun?

export abstract class AbstractLoadable<T extends AbstractLoadable<T>> { 

    protected isAngularComponent: boolean; 

    public constructor(isAngularComponent: boolean = true) { 
     this.isAngularComponent = isAngularComponent; 
    } 

    public initComponent(): T { 
     browser.waitForAngularEnabled(this.isAngularComponent); 
     if(this.isAngularComponent) { 
      browser.waitForAngular(); 
     } 

     return this as T; // Error here. 
    } 
} 

Der Fehler ist: Typ 'this' kann nicht auf den Typ 'T' umgewandelt werden. Typ 'AbstractLoadable<T>' ist nicht vergleichbar mit Typ 'T'.

Dieses Muster funktioniert in Java und ich bin neu in JavaScript und Typoskript. Kann man das in Typoskript abziehen?

Antwort

1

Im Gegensatz zu Java, Typoskript hat die polymorphic this type die in diesem Fall sehr nützlich ist:

export abstract class AbstractLoadable { 
    protected isAngularComponent: boolean; 

    public constructor(isAngularComponent: boolean = true) { 
     this.isAngularComponent = isAngularComponent; 
    } 

    public initComponent(): this { 
     browser.waitForAngularEnabled(this.isAngularComponent); 
     if(this.isAngularComponent) { 
      browser.waitForAngular(); 
     } 

     return this; 
    } 
} 

Wie Sie es vollständig die Notwendigkeit sehen für Generika für diesen Fall entfernt.
Der Compiler kennt die richtige Klasse und folgert, was die Rückkehr this ist, also, wenn wir sagen, Sie haben:

class MyClass extends AbstractLoadable { ... } 

Dann:

let instance = new MyClass().initComponent(); 

einen Wert vom Typ MyClass zurück.

Verwandte Themen